【Hibernate】【乐观锁,悲观锁】

事务并发的五类问题

  • 第一类丢失更新:两个事务同时更新一个数据,A提交,B回滚,数据回滚
  • 第二类 丢失更新:两个数据同时关系一个数据,A晚提交,B早提交,B无效
  • 脏读:一个事务内,读取了事务B未提交的数据.(结果事务B回滚,该事务就用了脏数据)
  • 虚读:一个事务内,前后读取不一致,(期间有人增加过数据)
  • 不可重复读:一个事务内两次读取同一条数据,返回结果不相同.(期间有人修改过该数据)

MySQL的隔离级别

Serializable(串行化):可避免脏读、不可重复读、虚读情况的发生。
Repeatable read(可重复读):可避免脏读、不可重复读情况的发生。(默认)
Read committed(读已提交):可避免脏读情况发生。
Read uncommitted(读未提交):最低级别,以上情况均无法保证。

悲观锁

原理:事务不并发.

事务A开始后,拿到锁.直至回滚或提交才放锁.其他事务无锁就一直等待(不提交,造成死锁),等同于: select for update

例1:

事务1:
Employee e1=session.get(Employee.class,1L,LockOptions.UPGRADE);//对该对象上锁
事务2:
Employee e1=session.get(Employee.class,1L);
e1.setName("XX");//执行修改时候被锁住

例2:

事务1:
Employee e1=session.get(Employee.class,1L,LockOptions.UPGRADE);//对该对象上锁
事务2:
Employee e1=session.get(Employee.class,1L,LockOptions.UPGRADE);//查询时候被锁住
e1.setName("XX");//不会到这一步

乐观锁

原理:支持并发:在类加属性,在表中加列 表示版本号
在查询对象时候,获得版本号;
在修改对象时, 版本号+1 where id=? AND 版本号=?;
此时,若版本号不一致,说明已经被更换数据,会导致本次更改失败

例:

//在类中
private Integer version;
//映射文件中
<version name="version"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值