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读取到更新后的数据。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END