悲观锁和乐观锁的理解

查了一下悲观锁和乐观锁的目的主要是为了避免脏读,看起来和oracle的默认隔离级别READ-COMMITED是冲突的。因为READ-COMMITED是可以避免脏读的。

细想一下,果然有问题。请看脏读的定义:

T1修改了记录,还没有提交,T2读取了该记录,T1回滚了修改。

READ-COMMITED能够防止当前事务读取之前事务正在修改的数据,但是不能防止它之后的事务修改当前事务正在读的数据或者结果集。

所以悲观锁应该是为了避免幻想读和不可重复读。悲观锁将正在读的数据锁住(实现方式是select语句后面加上for update),这样它之后的事务就不可以修改数据。

乐观锁和读数据的正确性没有关系,乐观锁是为了避免两个事务同时修改同一条数据,实现方式是在目标表上增加一列来记录版本号,每一个修改会把版本号+1,在提交的时候判断版本号是否小于+1后的版本号,如果不是,就知道别人修改了这条数据,进行相应的业务处理, 例如事务的回滚等。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值