《高性能 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不在数组中,则表明是已经提交的事务生成的,是可见的。
读已提交:读已提交的计算逻辑与可重复读类似,不过读已提交的事务数组是在每一个语句执行前重新构造。