私はGrailsサービスをトランザクションとしてマークしていますが、多くのことがあります。Grails Transaction Issues
私は、このメソッドにコードを追加し、私はそれをステップ実行するとき、私は期待する結果を得ていないのです。
- 私は全体の方法が終了するまで、MySQLバックエンドで見ることができない
.save()
を呼び出すコードを持っています。これは、サービスメソッドがトランザクション型であると私が期待するところです。 .save()
を呼び出すコードは、サービスメソッドが終了する前にMySQLで見ることができます。私はこれを理解しておらず、これと1の相違を理解していません。groovy.sql.Sql
を使用してデータベースに挿入するコードがさらにあります。私はこれがGrailsのトランザクション処理の外側であると推測しています。そのため、メソッドが終了する前にコミットするというのは理にかなっています。 Grailsにトランザクションの内部を管理させることはできますか?
私の前提に誤りがあれば、教えてください。ここではいくつかの関連するコードは次のとおりです。
主なサービス・メソッド
public void updateDb(Date date) {
// Create the results
if (createResults() > 0) {
createA()
createB()
}
}
createA
A a = new a()
a.user = user
a.week = week
a.save()
createB
userWeek = new UserWeek(user: user)
userWeek.number = 1
userWeek.save(flush: true)
createResults
String insert = "insert into ..."
Sql sql = new Sql(dataSource)
sql.execute(insert)
私はそれがフラッシュにするためにflush:true
を追加しましたが、私は今、それがトランザクションであるため、単にフラッシュ休止状態にはなく、実際にトランザクションをコミットないことを理解しています。私は間違って何をしていますか?
あなたが投稿したコードから何が起きているのかはっきりしていません。また、あなたが慣習を破っているようにも思えます。 1つのトランザクションコンテキスト(grailsメソッド呼び出し)内から、意図的にトランザクションを中断しようとしていますか? また、なぜ強制的にフラッシュしますか? –
@ HansWesterbeek私はトランザクションから抜け出そうとしていませんでした - 私は継承したコードを見ていて、それを理解しようとしています。私はテストとしてフラッシュを余儀なくされた(私は当時それを理解しなかったため)が、私はそれを削除する予定です。(トランザクションの外部で動作する現在の 'createResults'メソッドを除いて)、完全なトランザクションがコミットするまでコミットする必要はありません。 – skaz