插入一条name为"凡"的数据 事务id为100
时序图第12步
select name from account where id =1 这一步的查询 也有一个read-view
此时要根据数据库的隔离级别来判断read-view的内容
- 如果是可重复读的话 它的read-view就是沿用了当前查询事务第一次查询的时候的readview
图12
- 如果是读已提交 在每次select的时候都会按最新的情况再生成一次
目前分析的可重复读机制 所以第12步的时候 readview还是[100,200],300
此时MySQL拿着read-view到最新的版本链逐个去比对查询
MySQL底层有一个比对规则
readview未提交事务数组中最小的事务即min_id=100 已创建的最大的事务id即max_id=300 将所有的事务id分为3个部分
- 绿色部分 <min_id=100
绿色部分的事务id比未提交事务数组中的最小的事务id还要小 那么绿色部分的事务肯定已经提交了
- 黄色部分 >=100 && <=300
- 红色部分 >300
继续看图13 先拿到最新的数据
那么将会有自己的事务id假设为400 那么这个事务id也会在readview[100,200,400],300 未提交事务数组中 而且跟当前自己的事务id是一样的 那是可见的