hibernate乐观锁
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
测试代码:
3、hibernate中乐观锁的用法:
(1)在映射文件中增加version元素,version元素必须紧挨着id后面
(2)在实体类中增加用于版本控制的字段
(3)重新运行测试代码结果如下:
4、原理
1. 假设数据库中产品的价格是10000,version是10
2. session1,session2分别获取了该对象
3. 都修改了对象的价格
4. session1试图保存到数据库,检测version依旧=10,成功保存,并把version修改为11
5. session2试图保存到数据库,检测version=11,说明该数据已经被其他人动过了。 保存失败,抛出异常
5、总结
乐观锁的本质就是增加了版本version这个维度上的变化,根据version的改变来判断数据是否被其他人修改过。如果版本没变,就进行数据更新或删除;如果版本改变,就不进行数据更新或删除,从而来维护数据的一致性。
原文链接:hibernate乐观锁原理及其配置方法