返回信息流可重复读到底怎么读的?
看到两个版本。
1.第一次select时生成readview,大于max事务号读不到,小于min事务号能读到,在min max之间的,如果不在readview里,能读到。
2.根据数据行事务版本号,事务版本号大于当前事务读不到,事务版本小于能读到。
感觉1更合理些,但是这样的话会不会出现第一次select时,有已经提交的大于max的事务号,这样按1来读,就读不到了。
2是我在高性能mysql里看到的。
所以现在很迷惑。。。
这是一条镜像帖。来源:北邮人论坛 / database / #11546同步于 2020/10/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖
可重复读究竟是怎么判断版本号的?
m995877461
2020/10/13镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
事务启动瞬间,InnoDB 为每个事务构造一个视图数组,数组中是当前活跃的事务 id
对于所有事务的情况,可分为已提交事务、未提交事务、未开始事务
事务视图数组中 id 最小值记为低水位,即你说的 min
事务视图数组中 id 最大值加 1 记为高水位,即你说的 max
数据是否可见根据事务 id 可以分为三种情况
1、如果事务 id 落在已提交事务部分,表示该版本数据是已提交事务或者是当前事务自己生成的,数据可见。
2、如果事务 id 落在未开始事务部分,表示该版本数据是由将来启动的事务生成的,数据不可见。
3、如果事务 id 落在未提交事务部分,细分为两种情况
细分情况 1,事务 id 在视图数组中,表示该版本是还未提交的事务生成,不可见。
细分情况 2,事务 id 不在视图数组中,表示该版本由已经提交的事务生成,可见。
为什么第三种情况要细分,是因为有些事务 id 会处于未提交事务的范围中,但并不在视图数组中。例如当前视图数组为[1,2,3,5],此时事务 id=4 已经提交,但 id=4 在 1-5 的范围内,却又不在视图数组中,所以 id=4 这个事务提交的数据应该是可见的。