hibernate-entitymanager で Hibernate 2.6 を使用しています。オブジェクトで 2 つのトランザクションが競合する状況をキャッチして処理しようとしています。何が起こるかは次のとおりです。
2 つのスレッドが @Version フィールドを持つ単一のオブジェクトを更新しています。コミット競合を失ったスレッドは、フラッシュ時に StaleObjectStateException をログに記録します。例外はスローされず、ログに記録されるだけです。その時点で、トランザクションはロールバックのみとマークされていると思います。
その後、スレッドがコミットを実行しようとすると、RollbackException で失敗します。トランザクションがロールバックされる理由をコードで見つける方法が見つかりませんでした。
コードでそのような状況をキャッチして処理する方法はありますか? 基本的には StaleObjectStateException をキャッチしたいのですが、問題はスローされないことです。
更新:鳥瞰図から達成しようとしているのは次のとおりです。
JBoss で J2EE アプリケーションを実行しています。内部タイマーによって呼び出されるサービスと、UI から呼び出されるサービスがいくつかあります。また、重要なエンティティが 1 つあります。データの不整合が発生する可能性があるため、異なるスレッドがそのエンティティ クラスのオブジェクトを同時に更新できないようにする必要があります。これが、私が楽観的ロックを実装している理由です。
楽観的ロックの問題が発生した場合、私はこの状況を一般的に処理しようとしています。私はそれを非常に高いレベルでキャッチし、有効なユーザー メッセージを表示したいと考えています (私の場合、最高レベルは RestEasy の ExceptionMapper です)。問題は、RollbackException をキャッチした時点ですでに手遅れであることです。
手動でフラッシュしません。ほとんどの EJB は CMT を使用しており、セッションは自動的にフラッシュされます。