6查到的是旧数据,假如3不是select语句,6查出来的是4update后的数据,因为ReadView是在发起第一次查询的时候创建的;
假设左边是事务1,右边是事务2,
事务1,begin后产生trxid=1,事务2的trxid=2,执行3的时候因为trxid=1的事务还没有提交,所以ReadView=[1,2],到了执行6的时候,虽然5已经提交了,但是ReadView=[1,2]仍然不变,所以B的版本号回滚到小于ReadView的最小值的最大值。
4会一直阻塞,直到7执行完,然后4返回的是5执行完的结果
5返回的是4执行完的结果,3和6返回的是4执行前的结果,(注意:5在7执行前一直阻塞)
综上:for update是当前读,是读取已经提交的事务的最新版本,一般的select都是基于mvcc快照读的
幻读的介绍:
https://zhuanlan.zhihu.com/p/103580034?utm_source=wechat_session