Grailsでトランザクション問題が発生しています。 パフォーマンステストでは、同じユーザーに対して単一のAPIが複数回呼び出されるシナリオがあります。 各呼び出し時に、ドメインオブジェクト上で何かが変更され、データベースに保存されます。Grailsにトランザクションを保存する前に応答を送信しないようにするには?
私たちは、応答がクライアントに送信された後、同じAPIに対する別の要求がサーバーに到着する前に、データベースの更新が行われることを発見しました。 したがって、最初のAPIコールがデータベースを更新する前にデータベースからデータを選択するもう1つのAPI呼び出しで終わり、2番目の要求がデータベースにデータを保存しようとするとStaleObjectStateExceptionが返されます。
Grailsではトランザクションの終了時にすべてを保存する自動コミット機能を使用していました。だから最初の決定はコントローラのrender()の前に.save()を使うことでした。 シンプルなAPIであれば問題ありませんが、非常に多くのオブジェクトを追跡して明示的に保存しなければならない複雑なAPIがいくつかあります。現在、それはフラッシュなしで動作するようです:真ですが、私たちはまだテスト中です。
私の質問です:トランザクションがGrailsでコミットされる前に応答が送信されないようにする方法はありますか?
ロジックを[トランザクションサービス](http://grails.org/doc/2.0.x/guide/services.html#declarativeTransactions)にラップしてみましたか?サービスコールの中で処理することは役に立ちます。 – OverZealous
私はそれを試さなければならないでしょう。現在のところ、すべてのapisへの応答を作成する際には、オブジェクトのチェックが行われているため、更新が行われる可能性があるため、事前にオブジェクトを移動する必要があります。ありがとうございました。 – Krystian