首先要知道mvcc的两个概念,
1. undolog 可以理解为就是一个数据快照,里面包含数据,当前事务ID(相当于版本号)和上一个快照的指针。类似链表。
2. readview 可以理解为事务 读快照, 记录当前事务ID,其他未完成的事务ID。这就是多版本的来历。
就是每个事务就相当于一个版本,记录自己的版本,同时知道其他未完成事务的版本。
rc是每次读生成一个新的readview, 这样每次读都能获取到最新(规则:指当前版本或比未提交版本小的)的undolog。 这样就实现了读已提交。
而rr实现方式是一个事务下多次读使用同一个readview, 那每次查询就会读到同一条
undolog。可以解决重复读问题,同时 这样还可以解决一部分幻读问题。
但是如果两次快照读(就是指readview)之间发生了当前读(非普通select), 那么就会生成新的
readview. 当然新的readview不代表数据一定发生了变化,比如mysql在一些情况下会在事务中开启间隙锁,临键锁会
阻塞数据修改,那么虽然readview变了,但是根据规则找到的还是同一条undolog。
所以rr解决了一部分幻读的问题,但 当前读 仍然可能造成幻读。