との2つの操作を持つWebサービスで構成されるWebアプリケーションがcreateAありcreateBます。ハンドラーがエンドポイントに登録されます。このハンドラーはセッションを開き、要求を受信するとトランザクションを開始します。次に、要求された操作のコードが実行されます。応答が返送される前に、トランザクションがコミットされ、セッションが閉じられます。
のコードはcreateA、タイプのエンティティを作成し、メソッドAを使用してそれを永続化することで構成されています。Session.save()DEBUGモードでは、Session.save()が呼び出された後、セッションのActionQueueに1つの挿入があることがわかります。
のコードは次のものでcreateB構成されています。
- 以前に作成されたタイプのエンティティを取得する
A Bのインスタンスを参照するエンティティを作成しますA(Bには、関連付けられたを表すプロパティがありますA)Aの新しいインスタンスを参照するように更新していますBSession.save()の新しいインスタンスを呼び出すBSession.update()の新しい変更されたインスタンスを呼び出すA
ただし、DEBUGモードでは、Session.save()andを呼び出した後Session.update()、対応するセッションのActionQueueは空になります。しかし、トランザクションがコミットされた後、データベースに作成されたエンティティを確認できます。
操作createAとcreateBは、DEBUGなしでこの順序で呼び出されます。条件とメソッドを使用して以前に作成されBたインスタンスを取得しようとすると、作成の実行中にエラーが表示されます。問題は、のインスタンスが見つからないことです。ASession.list()A
ただし、DEBUGで同じ操作シーケンスを繰り返すかThread.sleep(15s)、2つの操作の呼び出しの間に使用すると、のインスタンスAが見つかります。
ありがとう
編集:特定のマシンでは動作するが、他のマシンでは動作しないことを正確に忘れました。そして、これらのマシンの間に違いは見られません。