たまに楽観的ロック例外が発生するシステムがあります。コードでこれを回避しましたが、JPA 2 を見ていると、これを処理するための注釈 (@Version) があることがわかります。
私たちが抱えている問題は、1 つのテーブルで複数のトランザクションが動作しており、完全なテーブル ロックを使用すると、同じレコードに変更が加えられていなくても、楽観的ロック例外が発生することです。
JBoss 4.2 サーバーで休止状態を使用しており、データベースは MySQL または SQL Server のいずれかです。
代わりに @Version を使用するように変更した場合、これにより両方のデータベースで行ロックが強制されますか、それとも完全なテーブル ロックによって引き起こされる楽観的ロック例外が引き続き発生することを期待できますか?
編集:
実際に見られるのは、楽観的なロック エラーではなく、デッドロックです。
SQLServerException: トランザクションが別のプロセスとのロック リソースでデッドロックされ、デッドロックの犠牲者として選択されました。トランザクションを再実行します。
コードでこれを処理しますが、この場合に @Version が役立つかどうか疑問に思っていました。
少なくとも 1 つのケースでは、このデッドロックは、2 つのクライアントが独自のデータを操作しているテーブル ロックが原因でした。