
文章插图
对该记录每次更新后 , 都会将旧值放到一条undo日志中 , 就算是该记录的一个旧版本 , 随着更新次数的增多 , 所有的版本都会被roll_pointer属性连接成一个链表 , 我们把这个链表称之为版本链 , 版本链的头节点就是当前记录最新的值 。另外 , 每个版本中还包含生成该版本时对应的事务id , 这个信息很重要 , 在根据ReadView判断版本可见性的时候会用到 。
undo日志Undo log 主要用于记录数据被修改之前的日志 , 在表信息修改之前先会把数据拷贝到undo log里 。
当事务进行回滚时可以通过undo log 里的日志进行数据还原 。
Undo log 的用途
- 保证事务进行rollback时的原子性和一致性 , 当事务进行回滚的时候可以用undo log的数据进行恢复 。
- 用于MVCC快照读的数据 , 在MVCC多版本控制中 , 通过读取undo log的历史版本数据可以实现不同事务版本号都拥有自己独立的快照数据版本 。
- insert undo log 代表事务在insert新记录时产生的undo log , 只在事务回滚时需要 , 并且在事务提交后可以被立即丢弃
- update undo log(主要) 事务在进行update或delete时产生的undo log ; 不仅在事务回滚时需要 , 在快照读时也需要; 所以不能随便删除 , 只有在快速读或事务回滚不涉及该日志时 , 对应的日志才会被purge线程统一清除
记录并维护系统当前活跃事务的ID(没有commit , 当每个事务开启时 , 都会被分配一个ID, 这个ID是递增的 , 所以越新的事务 , ID值越大) , 是系统中当前不应该被本事务看到的其他事务id列表 。
Read View主要是用来做可见性判断的, 即当我们某个事务执行快照读的时候 , 对该记录创建一个Read View读视图 , 把它比作条件用来判断当前事务能够看到哪个版本的数据 , 既可能是当前最新的数据 , 也有可能是该行记录的undo log里面的某个版本的数据 。
Read View几个属性
- trx_ids: 当前系统活跃(未提交)事务版本号集合 。
- low_limit_id: 创建当前read view 时“当前系统最大事务版本号+1” 。
- up_limit_id: 创建当前read view 时“系统正处于活跃事务最小版本号”
- creator_trx_id: 创建当前read view的事务版本号;

文章插图
- db_trx_id < up_limit_id || db_trx_id == creator_trx_id(显示) 如果数据事务ID小于read view中的最小活跃事务ID , 则可以肯定该数据是在当前事务启之前就已经存在了的,所以可以显示 。或者数据的事务ID等于creator_trx_id , 那么说明这个数据就是当前事务自己生成的 , 自己生成的数据自己当然能看见 , 所以这种情况下此数据也是可以显示的 。
- db_trx_id >= low_limit_id(不显示) 如果数据事务ID大于read view 中的当前系统的最大事务ID , 则说明该数据是在当前read view 创建之后才产生的 , 所以数据不显示 。如果小于则进入下一个判断
- db_trx_id是否在活跃事务(trx_ids)中 不存在:则说明read view产生的时候事务已经commit了 , 这种情况数据则可以显示 。已存在:则代表我Read View生成时刻 , 你这个事务还在活跃 , 还没有Commit , 你修改的数据 , 我当前事务也是看不见的 。

文章插图
MVCC和事务隔离级别上面所讲的Read View用于支持RC(Read Committed , 读提交)和RR(Repeatable Read , 可重复读)隔离级别的实现 。
RR、RC生成时机
- RC隔离级别下 , 是每个快照读都会生成并获取最新的Read View;
- 而在RR隔离级别下 , 则是同一个事务中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View , 之后的查询就不会重复生成了 , 所以一个事务的查询结果每次都是一样的 。
推荐阅读
- 万字干货,Python语法大合集,一篇文章带你入门
- Java各个时间类总结归纳,最全一篇
- 含代码实现 最全解密微信红包随机算法
- IP 通俗易懂网络协议
- 一篇文章教会你利用createjs实现界面效果
- 一篇文章教会你创建vue项目和用vue.js实现数据增删改查
- 一篇文章带你用jquery mobile设计颜色拾取器
- 零散的MySQL基础总是记不住?看这一篇如何拯救你
- 什么是Docker?看这一篇干货文章就够了
- 一篇文章搞懂热修复类加载方案原理
