沫言|解读数据库:深入分析MySQL中事务以及MVCC的实现原理( 五 )


select * from test where 事务id<=2-- 因为当前的事务id为24、假如这时候事务D又来了 , 把id=1的数据给删除了 , 这时候会把原数据的回滚指针记录为当前的事务id:4 , 所以此时数据如下:
沫言|解读数据库:深入分析MySQL中事务以及MVCC的实现原理5、回到事务B , 继续查询 , 应该还是只有1和2两条数据 , 那么他可能是这么查询的:
select * from test where 事务id<=2 and (回滚指针 is null or 回滚指针 >2)6、假如这时候又来了事务E , 对第2条数据进行了更新 , 这时候会生产一条事务id为5的数据 , 并把原数据的回滚指针也同时标记为当前的事务id:5 , 那么会得到如下数据:
沫言|解读数据库:深入分析MySQL中事务以及MVCC的实现原理根据上面猜测 , 执行下面的查询:
select * from test where 事务id<=2 and (回滚指针 is null or 回滚指针 >2)这时候发现 , 查出来的数据还是只有1和2两条 。
MVCC查询两大规则综上 , MVCC大致查询规则如下:1、只查询事务id小于等于当前事务id的数据 。 (这里要等于是因为假如自己的事务插入了一条数据 , 会生成一条当前事务id的数据 , 所以必须包含本事务自己插入的数据)2、只查询未删除(回滚指针为空)或者回滚指针大于当前事务id的数据 。 (这里不能等于是因为假如自己的事务删除了一条数据 , 会生成数据的回滚指针为当前事务id , 所以必须排除掉自己删除的数据)
当然 , 上面规则只是简化了 , 实际查询远比这里复杂 , 只是希望借助这种简单化的概念可以帮助大家更好的理解MVCC工作机制 。
作者:双子孤狼
【沫言|解读数据库:深入分析MySQL中事务以及MVCC的实现原理】原文链接: