事务隔离级别实现过程
快照读:所有select语句。
当前读:所有insert、update、delete,select for update(排它锁)、select ...share mode(共享锁)。
并发事务快照读(ReadView可见性过程):
- 当前事务开启事务后,读到当前快照。
- 获取Read View (一致性视图)里的快照。
- 当前快照版本号和ReadView里的版本号进行对比,重新计算本次事务的快照,如果都不适合,从Undo log中历史版本对比,再次重新计算本次事务的快照。
- 返回当前读到数据给所有并发事务。
RR原理
-
快照读
mvcc:并发事务只会读到读到当前事务里面首次生成的快照,直到这次事务结束为止才会重新计算快照。
-
当前读
LBCC 使用了当前元素的临键锁(左开右闭) + 相邻间隙锁,直到当前事务结束才释放锁。
RR如何解决不可重复读?
LBCC保证并发事务的安全,一次只能一个事务去操作。
RR如何解决脏读?
LBCC保证并发事务的安全,并且规定了一次事务提交完之后另外一个事务才可以操作。
RR为什么没有办法保证幻读?
ReadView无法保证并发事务下读到数据的一致性,有可能多了也有可能少了。
LBCC的锁机制可以保证并发事务下写写的数据准确,即保证数据修改的安全性。
RC原理
-
快照读
MVCC,并发事务下各自事务都会读到一个从新计算后的快照,无须等待事务结束。
-
当前读