readview

版本链

版本链

  • innodb存储引擎,聚簇索引记录中都包含两个必要的隐藏列
    • trx_id:每次对某条记录进行改动时,对会把对应的事务id赋值给trx_id隐藏列;
    • roll_pointer:每次对某条记录进行改动时,这个隐藏列会存一个指针,可以通过这个指针找到该记录修改前的信息;
    • 隐藏主键id:隐含的自增ID(隐藏主键),如果数据表没有主键,InnoDB会自动以DB_ROW_ID产生一个聚簇索引。

readview

  • read uncommitted隔离级别事务:直接读取记录的最新版本;
  • serializable隔离级别事务:使用加锁的方式来访问记录;
  • RC和RR隔离级别事务:需要用到版本链概念,核心问题是如何判断版本链中哪个版本是当前事务可见的?
  • readview中四个比较重要的概念:
    • m_ids:表示在生成readview时,当前系统中活跃的读写事务id列表;
    • min_trx_id:表示在生成readview时,当前系统中活跃的读写事务中最小的事务id,也就是m_ids中最小的值;
    • max_trx_id:表示生成readview时,系统中应该分配给下一个事务的id值;
    • creator_trx_id:表示生成该readview的事务的事务id;
  • 有了readview,在访问某条记录时,按照以下步骤判断记录的某个版本是否可见(除自己以外的活跃trx_id都不可见)
    • 1、如果被访问版本的trx_id,与readview中的creator_trx_id值相同,表明当前事务在访问自己修改过的记录,该版本可以被当前事务访问;
    • 2、如果被访问版本的trx_id,小于readview中的min_trx_id值,表明生成该版本的事务在当前事务生成readview前已经提交,该版本可以被当前事务访问;
    • 3、如果被访问版本的trx_id,大于或等于readview中的max_trx_id值,表明生成该版本的事务在当前事务生成readview后才开启,该版本不可以被当前事务访问;
    • 4、如果被访问版本的trx_id,值在readview的min_trx_id和max_trx_id之间,就需要判断trx_id属性值是不是在m_ids列表中?
      • 如果在:说明创建readview时生成该版本的事务还是活跃的,该版本不可以被访问
      • 如果不在:说明创建readview时生成该版本的事务已经被提交,该版本可以被访问;
  • 生成readview时机
    • RC(读提交 Read Committed)隔离级别:每次读取数据前,都生成一个readview;
    • RR(可重复读 Repeated Read)隔离级别:在第一次读取数据前,生成一个readview;
    • 在RR级别下的某个事务的对某条记录的第一次快照读会创建一个快照及Read View, 将当前系统活跃的其他事务记录起来,此后在调用快照读的时候,还是使用的是同一个Read View,所以只要当前事务在其他事务提交更新之前使用过快照读,那么之后的快照读使用的都是同一个Read View,所以对之后的修改不可见;
    • 即RR级别下,快照读生成Read View时,Read View会记录此时所有其他活动事务的快照,这些事务的修改对于当前事务都是不可见的。而早于Read View创建的事务所做的修改均是可见
    • 而在RC级别下的,事务中,每次快照读都会新生成一个快照和Read View, 这就是我们在RC级别下的事务中可以看到别的事务提交的更新的原因。

MVCC

多版本并发控制,指的就是在使用RC和RR隔离级别的事务,在执行普通select操作时,访问记录版本链的过程;使不同事务的读写、写读操作并发执行,提高系统性能;

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值