MVCC底层实现原理

首先

MVCC(Multi-Viewsion Concurrency Control) 又叫多版本协议控制,主要是提高数据库的并发性能。这里注意一下MVCC的落地实现是快照读。MVCC是用来解决读-写冲突的无锁并发控制,就是为事务分配单向增长的时间戳。

实现原理

判断规则

当执行查询sql时会生成一致性视图read-view,它由执行查询时所有未提交事务id数组(数组里面最小的id为min_id)和已创建的最大事务id(max_id)组成,查询的数据结果需要read-view做对比从而获得快照结果。

版本链比较规则:

1.如果落在绿色区域部分(trx_id<min_id),表示这个版本是已提交的事务生成的,这个数据是可见的

2.如果落到红色区域部分(trx_id>max_id),表示这个版本是由将来启动的事务生成的,是肯定的不可见的;

3.如果落在黄色区域部分(min_id<=trx_id<=max_id),那就包含两种情况

  • 若trx_idreadview数组中,表示这个版本是由还没有提交的事务生成的不可见当前自己的事务是可见的

  • 若trx_id不在readview数组中,表示这个版本是已经提交了的事务生成的可见

看图用一个例子说明一下:
在这里插入图片描述
说明: readView[]这个数组是在这个select语句一开始的时候就存在的,并且一直保持不变!这个一定要注意!!!因此不同的select语句可能存在两种不同的查询结果。主要原因就是一开始的readView[]数组是不一样的,后面有些更改的Session已经提交就不会在新的select的readView[]数组中出现。

删除情况

对于删除的情况可以认为是update的特殊情况,会将版本链上最新的数据复制一份,然后将trx_id修改成删除操作的trx_id,同时在该条记录的头信息(record header)里的(deleted flag)标记位上写true,来表示当前记录已被删除,在查询时按照上面的规则查到对应的记录如果delete_flag标记为true,意味着记录已被删除,则不返回数据
在这里插入图片描述

最后

如果说还是有不懂的地方可以参考B站诸葛老师讲的,多看两遍就OK了!我这边就是将这个重点的拆出来,便于理解!希望能够对你有帮助~
收工~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

聪明不喝牛奶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值