MVCC底层实现原理

首先

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

实现原理

判断规则

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

版本链比较规则:

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

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

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

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

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

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

删除情况

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

最后

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

你可能感兴趣的:(Java,Java面试知识点,java,开发语言,后端)