SQL MVCC的一些理解

参考:https://zhuanlan.zhihu.com/p/90944467
首先,表中每一行有两个隐藏值DATA_TRX_ID和DATA_ROLL_PTR,
前者为最后一次修改该行的事务id,后者为指向该行的上一条历史记录的指针,用于不断回溯得到想要的历史记录。

每次select时都会生成一个视图READ_VIEW,其为一个[min,max]数组,
这个数组表示当前未提交的所有事务id,其中当前事务id也位于这个数组中。
我们可以根据DATA_TRX_ID与[min,max]的关系划分为四个部分:
1.<min,表示该行在该事务前已被提交
2.>max,表示该行在该事务之后被提交
3.位于[min,max]内,表示该行被修改但未被提交
4.==当前事务id,表示该行被该事务修改过

分析这四种情况:
1、表示该数据在事务开始前就被提交;
2、表示该数据在该事务之后被提交过,也就是这个该行与事务刚开始的时候已经不一样了,读这个数据会出现不可重复读的情况;
3、表示读到了脏数据;
4、表示这个数据是自己修改的,可以放心读

那么,避免脏数据就是为了避免情况3,那么通过不断回溯得到1、2、4这三种情况即可;为了避免不可重复读,那么通过不断回溯得到情况1、4即可。但是,避免幻读是不行了,毕是在事务后被插入数据,它的DATA_TRX_ID肯定比当前事务id大,则必然属于2、3两种情况,这两种情况都会产生幻读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值