hibernate savealiasentity 保存后id为空_hibernate乐观锁

e66da9ae6b69086267bd0eeeff139209.png

1、概念

乐观锁的核心机制就是增加一个version字段,用于版本信息控制,获取对象时的版本和对该对象进行保存更新或删除时的版本信息一致时,才能对改对象进行更新。

2、首先看不使用乐观锁的情况

故意创造一个场景来制造脏数据。

1. 通过session1得到id=1的对象 product1

2. 在product1原来价格的基础上增加1000

3. 更新product1之前,通过session2得到id=1的对象product2

4. 在product2原来价格的基础上增加1000

5. 更新product1

6. 更新product2

最后结果是product的价格只增加了1000,而不是2000

073c6c3436415d9ccfa2a957b5770212.png

测试代码:

25ea0346358d6d331b5f70e41dc8a15d.png

3、hibernate中乐观锁的用法:

(1)在映射文件中增加version元素,version元素必须紧挨着id后面

e2a5247ffac15566c24b53721383bba7.png

(2)在实体类中增加用于版本控制的字段

eb406010da5cbe9c473fc97c572ae271.png

(3)重新运行如下代码:

ed4c0cd6e4f958ed8fd80f330333b8a6.png

做同样的业务就会抛出异常,提示该行已经被其他事务删除或者修改过了,本次修改无法生效。

这样就保证了数据的一致性。

dfcef8f91e94850380d73ee59ac6e285.png

4、原理

1. 假设数据库中产品的价格是10000,version是10

2. session1,session2分别获取了该对象

3. 都修改了对象的价格

4. session1试图保存到数据库,检测version依旧=10,成功保存,并把version修改为11

5. session2试图保存到数据库,检测version=11,说明该数据已经被其他人动过了。 保存失败,抛出异常

b8f93e23b6c11b5a94150f492e31c695.png

5、总结

乐观锁的本质就是增加了版本version这个维度上的变化,根据version的改变来判断数据是否被其他人修改过。如果版本没变,就进行数据更新或删除;如果版本改变,就不进行数据更新或删除,从而来维护数据的一致性。

参考链接:http://how2j.cn/k/hibernate/hibernate-optimistic-lock/101.html?p=7870

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值