mysql的MVCC

《高性能 MySQL》描述:
1. 通过两个隐藏列,一个保存行的创建时间,一个保存行的过期时间
RR隔离级别:检索创建时间在当前事务版本号之前的数据,同时会检查数据的删除时间,保证新的删除操作不可见。
select * from table where create_version <= ${version} and (delete_version is null or delete_version > ${version});

INNODB实现:

innodb的隐藏列不是创建时间和过期时间,而是当前事务的id列【在事务启动的时候向innodb申请的,是单调递增的】和删除标志位

undo log:undo log记录的是事务的反向逻辑操作

                                  图片来源于极客时间 - MySQL实战45讲

可重复读:

按照可重复读的定义,一个事务启动的时候,能够看到所有已经提交的事务结果。但是之后,这个事务执行期间,其他事务的更新对他不可见。

Innodb为每个事务构造了1个数组,用来保存这个事务启动瞬间,当前所有已经启动了但是还没有提交的事务id。

数组中事务ID的最小值记为低水位,ID的最大值加1记为高水位。这个数组和高低水位就组成了事务的一致性视图。而数据版本的可见性规则,就是基于数据的 row trx_id 和这个一致性视图的对比结果得到的。

 

                                      图片来源于极客时间 - MySQL实战45讲

如果数据的row trx_id 小于低水位,则表明这个版本是已经提交的事务或者当前事务自己生成的,这个数据是可见的。

如果row trx_id大于高水位,则表明这个版本是后来启动的事务生成的,是不可见的。

如果row trx_id大于低水位,小于高水位:

  如果 row trx_id在数组中,则表明是没有提交的事务生成的,是不可见的。

  如果 row trx_id不在数组中,则表明是已经提交的事务生成的,是可见的。

读已提交:读已提交的计算逻辑与可重复读类似,不过读已提交的事务数组是在每一个语句执行前重新构造。

原文地址:https://www.cnblogs.com/juanmaofeifei/p/13348187.html