只适合在RC和RR级别使用
已提交读和可重复读的区别就在于它们生成ReadView的策略不同
版本链+ReadView就是MVCC
开始事务时创建readview,readview维护当前活动的事务id,即未提交的事务id,排序生成一个数组。
访问数据,获取数据中的事务id(获取的是事务id最大的记录),对比readView。
如果在readView的左边(比readview都小),可以访问(在左边意味着该事务已经提交)。
如果在readView的右边(比readView都大)或者就在readview中,不可以访问,获取roll_pointer,取上一版本重新对比
(在右边意味着,该事务在readView生成之后出现,在readView中意味着该事务还未提交)
已提交读隔离级别下的事务在每次查询的开始都会生成一个独立的ReadView,而可重复读隔离级别则在第一次读的时候生成一个ReadView。之后的读都复用之前的ReadView。
这就是Mysql的MVCC通过版本链,实现多版本,可并发读-写,写-读。通过Readview生成的策略的不同实现不同的隔离级别。