本篇小欢子准备直接写一下对InnoDB隔离级别实现原理的当前理解,还望各位巨佬指正
RU
对于RU,InnoDB貌似没有做相关操作?并发能力最高,同时也无法避免并发带来的各种问题,如脏读,不可重复读等
S
对于S,目前理解就是“读写”、“写读”串行操作,要么先读后写,要么先写后读,并发能力最低
RC
对于RC,MVCC可以作用在该级别,每次快照读都会生成一个最新的ReadView(如代码所示)。ReadView当前理解其实就是一个对象或者说一个结构体,其里面的成员变量有生成这个ReadView的事务creator_trx_id,当前活跃事务的最大ID即max_trx_id,当前活跃事务的最小ID即min_trx_id,以及IDS,存放生成ReadView时的所有活跃事务的ID,在RC隔离级别下,快照读的流程大致是这样的
RR
对于RR,MVCC可以作用在该级别,如果只是单条快照读,那么流程与上图相同,但是如果是一个事务里面包含了多个快照读,那么流程与上图有些许差别。在RR级别下,若一个事务里面包含了多个快照读,那么ReadView只会在第一个快照读的时候创建,后面的快照读都以这个ReadView为依据,正因为这个方式,因此也避免了不可重复读这个问题
写在最后
MVCC真正的意义在于在保证并发相对安全的情况下,提高了并发能力,读(快照读)与写不冲突。但是写与写之间还是依靠锁机制来保证安全性。
附
import java.util.List;
/**
* @description: 一致性视图
* @create: 2021-07-30
**/
public class ReadView {
/**
* 创建ReadView的事务ID
*/
private int creator_trx_id;
/**
* 创建ReadView时活跃事务的最大ID,即最新的事务
*/
private int max_trx_id;
/**
* 创建ReadView时活跃事务的最小ID,即最久的事务
*/
private int min_trx_id;
/**
* 当前所有活跃事务ID的集合
*/
private List<Integer> ids;
}