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为何能读到已提交数据?的详细内容,更多请关注其它相关文章!