4

私の Grails アプリケーションは GORM を使用していませんが、代わりに独自の SQL および DML コードを使用してデータベースの読み取りと書き込みを行っています (データベースは正規化された巨大なレガシー データベースであり、これが唯一の実行可能なオプションでした)。

そのため、Groovy Sql Classを使用して作業を行います。データベースの呼び出しは、コントローラーで呼び出されるサービスで行われます。

さらに、私のデータソースは Tomcat で DBCP を介して宣言されているため、Datasource.groovy では宣言されていません。

私の問題は、トランザクション コードを記述する必要があることです。つまり、一連の DML 呼び出しが成功した後にトランザクションを開いてコミットするか、エラーが発生した場合はすべてをロールバックする必要があります。

groovy.sql.Sql#commit()groovy.sql.Sql#rollback()をそれぞれ使用すれば十分だと思いました。

しかし、これらのメソッドの Javadocs では、Groovy Sql のドキュメントに明確に記載されています。

この SQL オブジェクトが DataSource から作成された場合、このメソッドは何もしません。

だから、私は疑問に思います:私のコンテキストでトランザクションを実行するための提案された方法は何ですか? これらの2つのメソッドは「...何もしない」ため、データソース宣言で自動コミットを無効にしても無関係のようです

4

2 に答える 2

3

Groovy Sql クラスにはwithTransaction

http://docs.groovy-lang.org/latest/html/api/groovy/sql/Sql.html#withTransaction(groovy.lang.Closure)

public void withTransaction(Closure closure)
                     throws java.sql.SQLException

キャッシュされた接続を使用して、トランザクション内でクロージャを実行します。クロージャーが引数を 1 つ取る場合は、接続を使用して呼び出されます。それ以外の場合は、引数なしで呼び出されます。

試してみる。

于 2013-02-13T17:48:04.277 に答える