当您有多个实体

时间:2016-10-24 18:31:32

标签: java sql hibernate jpa transactions

假设我们使用隔离级别设置为: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方法?

1 个答案:

答案 0 :(得分:1)

乐观锁定仅适用于单个表行。在这种特定情况下,实体C可以成功更新,因为第二个事务不会修改C。

如果要在此处创建冲突,则必须使用以下任一乐观锁定请求:

在第二个事务中,以便在更新实体A时,还会触发C中的版本增量。

查看this article for more details