2012-06-03 11 views
5

私はGrailsサービスをトランザクションとしてマークしていますが、多くのことがあります。Grails Transaction Issues

私は、このメソッドにコードを追加し、私はそれをステップ実行するとき、私は期待する結果を得ていないのです。

  1. 私は全体の方法が終了するまで、MySQLバックエンドで見ることができない.save()を呼び出すコードを持っています。これは、サービスメソッドがトランザクション型であると私が期待するところです。
  2. .save()を呼び出すコードは、サービスメソッドが終了する前にMySQLで見ることができます。私はこれを理解しておらず、これと1の相違を理解していません。
  3. 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を追加しましたが、私は今、それがトランザクションであるため、単にフラッシュ休止状態にはなく、実際にトランザクションをコミットないことを理解しています。私は間違って何をしていますか?

+0

あなたが投稿したコードから何が起きているのかはっきりしていません。また、あなたが慣習を破っているようにも思えます。 1つのトランザクションコンテキスト(grailsメソッド呼び出し)内から、意図的にトランザクションを中断しようとしていますか? また、なぜ強制的にフラッシュしますか? –

+0

@ HansWesterbeek私はトランザクションから抜け出そうとしていませんでした - 私は継承したコードを見ていて、それを理解しようとしています。私はテストとしてフラッシュを余儀なくされた(私は当時それを理解しなかったため)が、私はそれを削除する予定です。(トランザクションの外部で動作する現在の 'createResults'メソッドを除いて)、完全なトランザクションがコミットするまでコミットする必要はありません。 – skaz

答えて

7

あなたが得ることができますgroovy.sql.Sqlサービス・メソッドではなくSql constructor that takes a connection argumentを使用して使用されるトランザクション内で実行されている:

  Sql sql = new Sql(sessionFactory.currentSession.connection()) 

これは、データの問題を解決する必要がありますが、同じサービス方法で異なる時間にコミット取得します。

+0

ありがとうございます - これは間違いなく私の問題の一部を解決します! – skaz

0

私も同様の状況でした。私のために解決したのは、refresh()メソッドを呼び出すことでした。私はまたフラッシュしました:真実と他のものがたくさんありますが、今まで働いたことはありません。

リフレッシュhereについて読むことができます。