5

トランザクションとしてマークされた Grails サービスがあり、多くのことを行います。

このメソッドにコードを追加していますが、ステップ実行しても期待どおりの結果が得られません。

  1. .save()メソッド全体が終了するまで、MySQL バックエンドで確認できない呼び出しを行うコードがあります。これは、サービス メソッドがトランザクションであることを考えると、私が期待することです。
  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しましたが、休止状態をフラッシュするだけで、トランザクションであるため実際にトランザクションをコミットしないことを理解しました。私は何を間違っていますか?

4

2 に答える 2

7

代わりに接続引数を取るコンストラクターをgroovy.sql.Sql使用して、サービス メソッドが使用しているトランザクションで実行することができます。Sql

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

これにより、同じサービス メソッド内でデータが異なるタイミングでコミットされるという問題が解決されます。

于 2012-06-03T17:36:44.277 に答える
0

私も同じような状況でした。私にとってそれを解決したのは、refresh() メソッドを呼び出すことでした。また、flush:true や他の多くのことも試しましたが、何も機能しませんでした。

リフレッシュについては、こちらをご覧ください。

于 2012-06-04T07:16:56.663 に答える