MYSQL的MVCC多版本并发控制讲解

1.什么是mvcc?

Mutil-Version Concurrency Control(多版本并发控制), 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。大白话就是一行数据具有多个不同的版本数据


2.mvcc讲解

我们来演示一下,假设一行数据有id、name和age,除此之外,还附有一些隐藏字段,比如隐藏id事务id回滚指针,那么这些隐藏字段是如何定义的呢?

  • 隐藏id:当innodb插入数据的时候,数据必须要包含一个索引的key值,可以是主键,如果没有主键,那么就是唯一键,如果没有唯一键,那么就是自生成的6字节rowid,全局唯一
  • 事务id: 每次你在进行数据库并发操作的时候要开启不同的事务,事务的版本号每次是递增的,所以每行记录后面要携带一个事务id。事务id就是指表示最近修改或更新当行记录的事务id,假设有A、B、C和D四个事务,事务id分别为1、2、3、4,事务D对当行数据进行修改,那么当行记录的事务id就是4
  • 回滚指针:指向的是上个对应的历史版本数据

2.1举例说明:在这里插入图片描述
事务A操作某一数据,数据包含上面所说的全部字段,因为它没有历史记录所以回滚指针为null,此时事务B又来操作该数据,将age值改为21,事务A操作的记录就变为了历史记录,事务B操作的记录就变为最新记录,回滚指针指向事务A操作的记录版本(这里的地址是乱写的)。那么这些记录是存放在哪呢?答案是存放在undolog里面。什么又是undolog呢?

undolo又称回滚日志,保证事务的原子性和实现mvcc,在进行数据操作时如果出现了错误或者用户执行了rollback语句时,系统可以利用Undo Log中的备份数据将数据恢复到事务开始之前的状态
在这里插入图片描述
我们继续回到例子中,既然mvcc叫多版本,所以数据不止两个版本。此时再来一个事务C操作该数据,记录形式就如下图显示一样(不用理会地址)在这里插入图片描述
2.2 这时候我们不经要思考了,那么多版本记录,我们该选择哪个版本呢?

  • 此处就会涉及到一个可见性算法,来计算当前事务读取的是哪一个版本的历史数据

  • 这时候就会联系到一个名词叫read view,直译过来叫读视图,当进行快照读的时候会生成一个事务id的列表,来保存不同的信息,通过这些信息来做可见性判断。下图是read view的组成
    在这里插入图片描述

  • 这里又出现个名词----快照读,啥意思呢?
    在这里插入图片描述
    2.3接下来我们就举例说明,存在多个历史版本时,该如何选择?
    在这里插入图片描述
    同时开启4个事务,前3个事务无操作,第4个事务做了更新操作并提交,之后事务1和事务3进行一些操作(不考虑),事务2进行快照读,此时只有事物4进行了更新操作,所以undolog只有1个历史版本。在事务2读取快照的是就会生成read view
    在这里插入图片描述
    我们来对照read view 各个组成概念来解释一下,list是活跃的事务id,为什么没有4呢?因为4已经提交了结束了,up_limit_id是当前活跃的事务id最小值那就是1了,lower_limit_id是尚未分配的下一个事务id,那就是5了

我们会产生下面这个问题
我们就会问事务2

2.4为了解决上面提出的那个问题,那就要看看我们生成了read view 要干嘛了
在这里插入图片描述
上面的是可见性算法的规则,我们生成的read view按照规则去实现,来选择我们哪个历史版本数据

那我们来看看是如何实现的?首先进入第一个判断根据我们的定义事务id是表示最近修改或更新当行记录的事务id,所以它是4,up_limit_id是1,4大于1,所以进入第二个判断low_limit_id是5,4小于5,所以进入第三个判断,事务id不在活跃事务列表中,所以事务4修改的结果是可以被看见的。

2.5总结
在这里插入图片描述
根据上面得到的结果,事务2在快照读的时候对事务4做的更新操作并提交的结果是能看到的,所以对应的是RC隔离级别(read committed d读已提交);我们了解到的RR隔离级别(repeatable-read 可重复读)是不能看到的。我们回到最初的问题,那么多版本数据我们到底选择哪个?

根据可见性算法,由两个东西决定:当前行事务id和read view ;当前行事务id一样,所以就看read view的生成时机了。当然在不同的隔离级别生成的时机是不一样的,RC是每次快照读的时候生成新的read view,而RR是第一个执行快照读的时候生成的read view,并且之后都是这个版本。

写在最后:mvcc至此就讲完了,如果在哪个地方讲错的,请联系我改正过来,希望不要误人子弟!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值