在隔离级别为读未提交的情况下,为什么一个事务在修改数据时已经加了写锁,还是会被另一个事务读取到未提交的数据?

首先,写锁仅仅是阻止其他事务施加读锁,而不是禁止事务读取数据。(参考周志明的《凤凰架构》)。

  1. 以隔离级别为读未提交为例。读未提交下,修改数据时事务会加写锁,但读取数据时事务不会加读锁(任何隔离级别写数据都要加写锁,否则事务会脏写,连原子性都不能保证)。这导致了读未提交级别下,事务会脏读。这是因为读未提交下,事务在读取数据时,是不会加读锁的,所以读取数据不会被另一个事务的写锁阻止,这反而能让该事务读取到其他事务加了写锁的数据修改。
    感谢评论区指正,作了以下修改~:
  2. 当隔离级别提高到读已提交(RC)或可重复读(RR),普通读基于MVCC实现了快照读(ReadView),读取数据是不加锁的;当前读时,则会加读锁。
  3. 当隔离级别提高到可串行化,此时事务读取数据,总会加读锁。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值