MySQL MVCC下,UPDATE后SELECT为何能读到已提交数据?

mysql mvcc下,update后select为何能读到已提交数据?

MVVC隔离级别下,SELECT为什么在UPDATE后可以读到?

MySQL事务隔离级别为MVCC时,事务A执行UPDATE操作后,事务B执行SELECT操作,一般情况下,B是读不到A更新的数据的。但有一个例外的情况是,B可以读到A在UPDATE操作提交后写入的数据。

原因分析:

MVVC的读操作会基于事务ID生成一个快照,并按照如下规则查找数据:

  • 规则1: 按事务ID和快照读区间查找数据,如果找到目标数据,则返回。
  • 规则2: 如果规则1没有找到目标数据,则按普通方式在当前数据集中查找目标数据,如果找到目标数据,则返回。

在问题描述的场景中,事务A的UPDATE语句提交后,id=5的数据已被写入,满足规则1的条件。因此,第二次SELECT操作可以通过规则1找到id=5的数据。

由此可见,虽然MVVC隔离级别下快照读一般不能立即读取UPDATE之后的数据,但如果UPDATE操作已提交,则后续SELECT操作可以根据上述规则1读取到更新后的数据。

以上就是MySQL MVCC下,UPDATE后SELECT为何能读到已提交数据?的详细内容,更多请关注其它相关文章!