首先
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_id
在
readview数组中,表示这个版本是由还没有提交的事务生成的
,不可见
,当前自己的事务是可见的; -
若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了!我这边就是将这个重点的拆出来,便于理解!希望能够对你有帮助~
收工~