答案一定是否定的。在 RR可重复读隔离级别下事务一旦通过第一次SELECT快照读生成了 Read View这个 Read View 就会一直伴随这个事务直到结束。中间无论你执行了多少次UPDATE、INSERT或DELETE都不会去新建或更新这个 Read View。那么疑问就产生了既然Read View是老的那我在事务里执行了UPDATE紧接着再执行SELECT岂不是连我自己刚才更新的数据都看不到了之前的博客中我们讨论过Read View这个数据结构中到底存了啥https://blog.csdn.net/Chen_3219/article/details/161146629?fromshareblogdetailsharetypeblogdetailsharerId161146629sharereferPCsharesourceChen_3219sharefromfrom_link他不仅存了活跃事务列表m_ids它还存了一个极其关键的字段creator_trx_id创建这个 Read View 的当前事务 ID。当你在事务 A假设trx_id 100中执行查询时MVCC 会拿着底层数据的隐藏列trx_id和你的 Read View 进行比对。它的第一条铁律就是规则 1看自己的如果底层这行数据的trx_id等于Read View 里的creator_trx_id。说明什么说明这行数据就是我自己刚刚修改的呀直接可见无视其他所有规则规则 2看别人的如果trx_id不等于自己那才去套用复杂的活跃事务列表判断决定能不能看。所以你执行SELECT叫快照读看 Read View老照片。你执行UPDATE叫当前读。它会完全无视你手里那个老的 Read View强行去 B 树上摸此刻最新、已经被别人提交过的真实数据加锁然后在这个最新数据上进行修改。修改完后把这行新数据的trx_id盖上你自己的大印。你执行UPDATE时底层那行新数据的trx_id就变成了你自己的事务 ID。随后你再执行SELECT虽然用的是老 Read View但命中“规则 1”所以你能完美读到自己刚刚更新的最新值。根本不需要劳民伤财去新建一个 Read View