JPAでの楽観的ロックの利点について少し混乱しています。
バージョン管理されたエンティティテーブルで2つのスレッドと1つの行を使用してテストを実行しました。
これが私が見つけたものです:
T1: begin tran
T1: fetch single entity
T1: Update field in entity
T1: sleep
T2: begin tran
T2: fetch single entity
T2: Update field in entity
T2: commit trans
T1: wake up
T1: commit trans - throws OptimisticLockException (expected)
2番目のテスト。selectステートメントが追加されていることに注意してください。
T1: begin tran
T1: fetch single entity
T1: Update field in entity
T1: run select query on table (this causes a DB transaction to begin)
T1: sleep
T2: begin tran
T2: fetch single entity (this blocks until DB transaction of thread T1 completes!)
T2: Update field in entity
T2: commit trans
T1: wake up
T1: commit trans - ok, no exception. The fetch/update/commit of T2 happened after T1 commit.
楽観的ロックを使用するときにブロッキングが発生することは実際には予想していませんでしたが、selectステートメントから正しいデータが返されるように、ここでデータベーストランザクションを実行する必要があることを理解しています。
JPAは絶対に必要な場合にのみデータベーストランザクションを入力するように見えるので、楽観的ロックの利点を誰かが説明できますか?