Hibernate进阶(三)Hibernate乐观锁与悲观锁

版权声明:程序猴jwang版权所有 https://blog.csdn.net/qq_21046965/article/details/86668868

前言

      本章讲解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已经不建议使用该参数了!

猜你喜欢

转载自blog.csdn.net/qq_21046965/article/details/86668868