2011-01-06 8 views
1

私が行うアプリケーションがあります:2つの要求は、その後、私は時々HibernateOptimisticLockingFailureExceptionを取得し、同じオブジェクトを削除しようと、並列に実行されている場合、私は明示的に、バージョンfield.Howeverでoptimistic lockingを設定していないデタッチされたオブジェクトのデフォルトのオプティミスティックロックを休止しますか?

void deleteObj(id){ 
    MyObj obj = getObjById(id); 
    if (obj == null) { 
     throw new CustomException("doesn't exists"); 
    } 
    em.remove(obj);//em is a javax.persistence.EntityManager 
} 

を他の時は "CustomException"となります。

オプティミスティックロックを明示的に設定せずにHibernateOptimisticLockingFailureExceptionを取得するのは正常ですか?切り離されたオブジェクトのデフォルトのオプティミスティックロックを休止しますか?

このHibernateOptimisticLockingFailureExceptionを処理するために何をしていますか?再試行するか、「サーバービジー」のようなデフォルトのメッセージでユーザーに通知しますか?

答えて

4

まず、HibernateOptimisticLockingFailureExceptionは、Springの永続性例外変換メカニズムの結果です。 (バージョン管理と長いトランザクションを使用した場合)、セッションは、古いデータが含まれていることを示す、

バージョン番号またはタイムスタンプのチェックが失敗した場合にスローされます

:それは、そのjavadocを言うStaleStateExceptionに応じて投げています。また、存在しない行を削除または更新しようとすると発生します。

データ変更ステートメントが影響を受ける行の予期しない数を返す場合、通常のロックの例外が発生します。これは、バージョン値の不一致、および行がまったくないことによって引き起こされる可能性があります。

は実体が実際にあなたが右取り除いた後 em.flush()によってコンテキストをフラッシュしようとすると、それによってスローされた例外をキャッチすることができます削除されたことを確認するために(それが原因として StaleStateExceptionを持つ PersistenceExceptionのサブクラスでなければならないことに注意してください)。

+0

tks! 「存在しない行を削除または更新しようとすると発生します」と、これが私の場合です。例外を処理する良い方法は何ですか?再試行?または「サーバービジー」のような既定のメッセージを送信する必要がありますか? –

+0

ご存知のとおり、再試行しても行が再び表示されることはありません。そして、ビジー状態のサーバーは、データベースから行を消してはいけませんか? – meriton

+0

それを処理する方法については、単に例外を無視しますか?削除すると、すでに行が削除されています。すでに削除されている場合は、すでに行なわれています。 – meriton

関連する問題