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