我对 JPA 中乐观锁定的好处有点困惑。
我在版本化实体表上使用两个线程和一行进行了测试。
这是我发现的:
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)
第二次测试。注意添加了一个 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 似乎只在绝对必要时才进入数据库事务,任何人都可以解释乐观锁定的好处是什么?