0

スレッドがデータベースからオブジェクトを取得して編集し、フラッシュするとStaleObjectStateExceptionが発生するという状況があります。これは、その間に別のスレッドが同じオブジェクトを編集したためです(楽観的ロックを使用しています)。なぜそれが起こっているのかはわかりますが、この動作を変更することはできません。

だから私がやろうとしているのは、dbからオブジェクトを再度取得し、最新バージョンに変更を再適用することですが、何かを変更する前に取得を行うとすぐに、別のStaleObjectStateExceptionが発生します。これはなぜですか?

try{
    songs = nextSongGroup.getSongs(session);
    modifySongs(songs);
    session.flush();
}
catch(StaleObjectStateException sobe){
     songs = nextSongGroup.getSongs(session);
     modifySongs(songs);
}
4

1 に答える 1

1

この例外が発生した場合は、すでに手遅れです。セッションを破棄して、新しいセッションを取得する必要があります。同じセッションでクエリを実行すると、同じ例外が発生します。

理論的には em.clear(); を呼び出します。同じクエリを再実行すると役立つ場合があります。私はこれを試したことはありません。

私の場合、通常、クリーンなセッションでリクエストを再実行する再試行ボタンのある Oops ページをユーザーに提示します。

于 2012-06-21T11:35:23.913 に答える