前言
本章讲解Hibernate中关于乐观锁和悲观锁的基本概念
方法
1.概念
通过前面对事务的学习,我们了解到事务并发过程中存在了诸多的问题,也提供了相应的事务隔离级别来进行解决!当然我们的Hibernate也可以设置这样的隔离级别:
在hibernate.cfg.xml进行如下配置:
<!--8 - Serializable 串行化
4 - Repeatable Read 可重复读
2 - Read Commited 可读已提交
1 - Read Uncommited 可读未提交-->
<property name="hibernate.connection.isolation">2</property>
而对于Hibernate而言呢,还有一种解决自定义的解决方式,它对于记录的操作指明了两个方式,那就是乐观锁和悲观锁
2.乐观锁
从字面理解,那就是乐观主义态度的锁机制!
当事务A对某行数据进行操作的时候,事务B也可以对该条数据同时进行操作,如果B修改了数据并提交,那么A事务对于该条记录的修改提交将会失败!
- 优点:并发性好,性能较高
- 缺点:用户体验差,当一个用户修改完数据后提交被告知修改失败,这将是很苦恼的
实现方式:
在需要加乐观锁的实体类中加入版本控制字段version,每次更新后都将版本控制字段加1。
实体类编写如下:
3.悲观锁
悲观锁的理论和乐观锁恰恰相反,但是实现效果一致!
他认为,我们一旦对一条记录进行操作,那么为了避免并发问题,直接在该条数据上加锁!
也就是说,当事务A对某行数据进行操作的时候,事务B无法对该条数据同时进行操作
- 优点:会锁住记录,一个用户操作完成前,其他用户无法操作
- 缺点:并发性不好,性能较低
实现方式:
1)悲观锁的几种方式:
- LockMode.NONE:无锁机制
- LockMode.WRITE:进行insert或者update时加锁
- LockMode.READ:进行read时加锁
- ......
2)悲观锁的实现
在get方法后还有第三个参数,该参数用来设置悲观锁!
示例:
session.get(Emp.class,1, LockMode.WRITE);
但是目前hibernate4已经不建议使用该参数了!