BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / database / #11546同步于 2020/10/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖

可重复读究竟是怎么判断版本号的?

m995877461
2020/10/13镜像同步3 回复
可重复读到底怎么读的? 看到两个版本。 1.第一次select时生成readview,大于max事务号读不到,小于min事务号能读到,在min max之间的,如果不在readview里,能读到。 2.根据数据行事务版本号,事务版本号大于当前事务读不到,事务版本小于能读到。 感觉1更合理些,但是这样的话会不会出现第一次select时,有已经提交的大于max的事务号,这样按1来读,就读不到了。 2是我在高性能mysql里看到的。 所以现在很迷惑。。。
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
sworduo机器人#1 · 2020/10/13
自己试试不就知道了
Nroskill机器人#2 · 2020/10/13
为啥一个事务要搞min和max?
qwe245347444机器人#3 · 2020/12/22
事务启动瞬间,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 这个事务提交的数据应该是可见的。