1

私は次のようなアプリケーションを持っています:

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
}

バージョンフィールドを使用してオプティミスティックロックを明示的に構成していません。ただし、2つのリクエストが並行して実行され、同じオブジェクトを削除しようとすると、HibernateOptimisticLockingFailureExceptionが発生する場合と、「CustomException」が発生する場合があります。

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

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

4

1 に答える 1

4

まず第一に、HibernateOptimisticLockingFailureExceptionSpring の永続例外変換メカニズムの結果です。に応答してスローされStaleStateException、その javadoc は次のように述べています。

バージョン番号またはタイムスタンプのチェックに失敗した場合にスローされ、セッションに古いデータが含まれていたことを示します (バージョン管理でロング トランザクションを使用している場合)。存在しない行を削除または更新しようとした場合にも発生します。

常識的には、データ変更ステートメントが予期しない数の影響を受ける行を返すと、楽観的ロック例外が発生します。行がまったく存在しないだけでなく、バ​​ージョン値の不一致が原因である可能性があります。

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

于 2011-01-06T21:09:28.540 に答える