一、快照读和当前读(参考这篇文章)
在RR级别中,通过MVCC机制,虽然让数据变得可重复读,但我们读到的数据可能是历史数据,不是数据库最新的数据。这种读取历史数据的方式,我们叫它快照读 (snapshot read),而读取数据库最新版本数据的方式,叫当前读 (current read),这两者是冲突的。
1.快照读
当执行select操作时,Innodb默认执行快照读,会记录下这次select后的结果,之后select 的时候就会返回这次快照的数据,即使其他事务提交了不会影响当前select的数据,这就实现了可重复读了(InnoDB默认隔离级别是可重复读,和这个说法一致)。快照的生成时机是在第一次执行select的时候,也就是说假设当A开启了事务,然后没有执行任何操作,这时候B insert了一条数据然后commit,这时候A执行 select,读到的数据中就会有B添加的那条数据。之后无论再有其他事务commit都没有关系,因为快照已经生成了,后面的select都是根据快照来的。
先提一句:快照读是通过MVCC和undo log实现的,暂不展开
2.当前读
对于会修改数据的操作(update、insert、delete)都是采用当前读的模式,通过加锁来保证增删改的数据无法通过其他事务访问。在执行这几个操作时会读取最新的记录,即使是别的事务提