2012-01-30 6 views
2

Grailsでトランザクション問題が発生しています。 パフォーマンステストでは、同じユーザーに対して単一のAPIが複数回呼び出されるシナリオがあります。 各呼び出し時に、ドメインオブジェクト上で何かが変更され、データベースに保存されます。Grailsにトランザクションを保存する前に応答を送信しないようにするには?

私たちは、応答がクライアントに送信された後、同じAPIに対する別の要求がサーバーに到着する前に、データベースの更新が行われることを発見しました。 したがって、最初のAPIコールがデータベースを更新する前にデータベースからデータを選択するもう1つのAPI呼び出しで終わり、2番目の要求がデータベースにデータを保存しようとするとStaleObjectStateExceptionが返されます。

Grailsではトランザクションの終了時にすべてを保存する自動コミット機能を使用していました。だから最初の決定はコントローラのrender()の前に.save()を使うことでした。 シンプルなAPIであれば問題ありませんが、非常に多くのオブジェクトを追跡して明示的に保存しなければならない複雑なAPIがいくつかあります。現在、それはフラッシュなしで動作するようです:真ですが、私たちはまだテスト中です。

私の質問です:トランザクションがGrailsでコミットされる前に応答が送信されないようにする方法はありますか?

+0

ロジックを[トランザクションサービス](http://grails.org/doc/2.0.x/guide/services.html#declarativeTransactions)にラップしてみましたか?サービスコールの中で処理することは役に立ちます。 – OverZealous

+0

私はそれを試さなければならないでしょう。現在のところ、すべてのapisへの応答を作成する際には、オブジェクトのチェックが行われているため、更新が行われる可能性があるため、事前にオブジェクトを移動する必要があります。ありがとうございました。 – Krystian

答えて

0

これは、私たちがテストに使用したツール - SoapUIによるものです。応答が返る前に重複要求を送信できます。これはGrailsの欠陥だと思った。そうではありませんでした。

0

これはおそらくキャッシングによるものです.dbの状態に関する保証が必要な場合は、.save(flush:true)する必要があります。

これはセッション全体をフラッシュするため、パフォーマンスに悪影響を与えることがあります。

編集: すでにあなたについての情報を見ずにあなたの質問を読むことができたかどうかわかりません。

とにかく、それは確かにあなたが行かなければならない方法です。

+0

ええ、それは私がやっていることです。しかし、私はそうしない方法を探しています。私は、明示的にそれらを保存するためにすべての変更/修正を追跡したくありません。しかし、私は選択肢がないようだ:/ – Krystian

関連する問題