对于默认的乐观锁定机制
@Version
-
从数据库中获取实体及其版本:
SELECT * FROM PRODUCT WHERE ID = 1;
-
更新或删除将使用与获取实体相同的SELECT获取的版本:
UPDATE PRODUCT SET (LIKES, QUANTITY, VERSION) = (5, 10, 3)
WHERE ID = 1 AND VERSION = 2;
休眠只检查
updateCount
试验结果
PreparedStatement.executeUpdate
更新计数
,这意味着行已被删除或版本已更改,这意味着我们使用的是过时数据,因此
OptimisticLockException
因此,默认值不会发生冲突
@Version
基于乐观锁定,因为一次只能由单个事务修改一条记录,并且一旦行被修改锁定,锁将一直保持到事务提交或回滚。
LockModeType.OPTIMISTIC
会导致比赛状态。但是,你可以很容易地
fix that using a pessimistic shared or explicit lock
.