MVCC实现过程

什么是MVCC

MVCC,多版本并发控制。

通过保存数据的历史版本,根据比较数据的版本号来决定数据的是否显示,在不需要加读锁的情况就能达到事务的隔离效果,最终可以在读取数据的时候可以同时进行修改,修改数据时候可以同时读取,极大的提升了事务的并发性能。

部分名词解释

名词解释
事务版本号一个事务开启后都会获得一个自增长的事务的ID,由此判断先后顺序
trx_id记录操作该数据事务的事务ID
roll_pointer相当于一个指针,指向回滚段的undo日志
row_id单调递增的行ID,不是必需的,占用6个字节
undo log回滚日志,用于记录数据被修改前的信息
版本链多个事务并行操作某一行数据时,不同事务对该行数据的修改会产生多个版本,然后通过回滚指针,连成一个链表
快照读读取的是记录数据的可见(有旧版本)版本(不加锁)
当前读读取的是记录数据的最新版本(显式加锁)
Read View执行SQL语句时产生的读视图,判断当前事务可见哪个版本的数据
m_ids当前系统活跃未提交的所有事务ID(列表)
up_limit_id生成Read View时,当前系统中活跃的读写事务中最小的事务id
low_limit_id生成Read View时,系统中应该分配给下一个事务的id值
creator_trx_id创建当前Read View的事务ID

MVCC实现流程

在这里插入图片描述

说明一下Read View的匹配规则。

1)如果数据事务ID trx_id < up_limit_id,表明生成该版本的事务在生成Read View前,已经提交(因为事务ID是递增的),所以该版本可以被当前事务访问。

2)如果trx_id >= low_limit_id,表明生成该版本的事务在生成ReadView后才生成,所以该版本不可以被当前事务访问。

3)如果 up_limit_id <= trx_id < low_limit_id,需要分3种情况讨论

(1)如果m_ids包含trx_id,则代表Read View生成时刻,这个事务还未提交,但是如果数据的trx_id等于creator_trx_id的话,表明数据是自己生成的,因此是可见的。
(2)如果m_ids包含trx_id,并且trx_id不等于creator_trx_id,则Read View生成时,事务未提交,并且不是自己生产的,所以当前事务也是看不见的;
(3)如果m_ids不包含trx_id,则说明你这个事务在Read View生成之前就已经提交了,修改的结果,当前事务是能看见的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值