假设我们使用隔离级别设置为:read_committed的DB
我们还使用带@Version
注释的JPA实体。
我们有两个交易T和K,如下:
T ------------------------------------- ķ
启动
读A
读B
读C
-------------------------------------- start
--------------------------------------更新A
--------------------------------------结束
更新C
使用的状态
对象A和B
结束
在事务T的这一点,C的更新成功,(版本检查没问题),所以我们使用从未真正存在的状态更新C DB。
我的理解有什么问题?
编辑:
@Vlad
考虑这个例子:
Ť---------------------------------------------- --------ķ
开始交易
阅读A
-----------------------------------------------开始交易<登记/>
----------------------------------------------- Mod A <登记/>
----------------------------------------------- Mod B <登记/>
-----------------------------------------------结束交易<登记/>
阅读C版= 1
阅读B
//使用数据da A和B
//更新C
A,B - &gt; ç
// update is successfull(检查版本没问题)
结束交易
使用OPTIMISTIC_FORCE_INCREMENT你基本上是在告诉我 使用此选项设置正确的find方法?
答案 0 :(得分:1)
乐观锁定仅适用于单个表行。在这种特定情况下,实体C可以成功更新,因为第二个事务不会修改C。
如果要在此处创建冲突,则必须使用以下任一乐观锁定请求:
在第二个事务中,以便在更新实体A时,还会触发C中的版本增量。