承接上文MySQL的MVCC底层原理
上文说到时序图中的第12步 这篇文章咱接着聊完
时序图
read-view为[100,200],300 即未提交数组事务id为100和200 最大的事务id为300
去id为1的数据的版本链中根据比对规则去查找数据
最新的一条数据
事务id为100 100在这个查询的未提交的事务数组中 所以这条数据对于当前查询事务是不可见的 那么继续在版本链上找
根据回滚指针找到第二条数据
事务id为300也是落到黄色部分的区间 根据版本链的对比规则可知 这一行数据的事务id300不在未提交事务的数组中 说明这个版本的数据是已经提交的事务产生的 这是可见的 截止目前找到了这条数据 就会把这条数据返回
继续看下时序图第14和15步骤
又更新了2个SQL语句 第14步: update account set name='人' where id =1; 第15步: update account set name='笔' where id =1;
那么此时id=1的数据版本链是
时序图第16步
select name from account where id =1
可重复读的readview会沿用第一次查询时候的readview[100,200],300 如果已提交读的话每次select都会生成一次最新的readview 未提交事务数组为[200]
可重复读readview去最新版本链中找