MySQL进阶之路(十三)—— MVCC的原理及意义探究

MySQL进阶之路(十三)—— MVCC的原理及意义探究

一、概述

​ 上一篇文章说到了InnoDB引擎的事务的隔离级别,本篇文章将会详细的介绍MVCC机制,涉及到的内容 比较多,但是都不难。

​ MVCC是 multiversion concurrency control的简写,中文意思是多版本并发控制,该技术允许具有特定隔离级别的InnoDB事务执行一致的读操作;除了可以查询其他事物正在更新的数据之外,还可以查询这些更新发生之前的数据。此技术大大地提高了数据库的并发性,使得查询操作不需要等到其他事物持有的锁。

​ 该技术主要通过隐藏字段undo log版本链read view机制来实现的

二、MVCC应用在什么样的场景?

​ 多版本并发控制,其使用场景即是多个事务并发执行的情况之下,但是事务并发执行有如下三种情况:1.读-读 2.读-写 3.写-写。我们知道,在第一种读-读的场景下基本上不会出什么问题,但是在第二、第三种场景下容易出现脏写、脏读和不可重复读的问题。对于第三种场景,我们不得不通过加锁来进行并发控制,而对于第二种场景如果和第三种场景一样使用加锁来解决的话无疑会严重影响并发时的性能,因此采用了MVCC来很好的控制多个事务的读-写操作,并解决冲突

三、神秘的隐藏字段有哪些?

​ 对于数据库的每一条数据其实它们都隐藏了几个字段,这些字段记录的信息仅仅被数据库内部的技术所用,因此不会展示出来。

​ 隐藏的三个字段:

DB_ROW_ID: 隐藏的id字段。因为在建立一个表的背后是创建一个B+树,创建B+树需要根据主键来建立,如果表里没有指定主键,那么这个隐藏字段将被作为主键来构建B+树。

DB_TRX_ID: 最后一次更新这一行数据的事务ID

DB_ROLL_PTR:回滚指针,指向的是undo log日志,可以立即为指向了修改前的历史数据

四、undo log版本链长什么样?

​ 因为每次事务对数据进行更新后都会在隐藏字段上记录事务的ID,并且事务ID是自增的,因此可以根据该字段的大小就可以判断是否是最新的数据,也就是所谓的版本号,版本链种的链字体现在隐藏字段DB_ROLL_PTR上,该字段指向了上一个版本的数据,使得各各版本的数据形成了链状结构。如下图所示:

请添加图片描述

五、Read View机制是什么?

​ Read View,中文意思是读视图,其实是InnoDB的MVCC机制使用的内部快照。简单来说,就是当一个读事务开启的时候,会生成一个Read View,里面记录了此事务开启时数据库中其他事务的情况。为什么要记录这些呢?因为,因为知道了其他事务的进行情况后就可以根据隐藏字段TRX_ID来判断此数据在当前隔离级别之下是不是可以读取的

Read View中重要信息:

  • m_ids:还未提交的事务的ID
  • min_trx_id:m_ids中的最小值
  • max_trx_id:下一个新生成的事务ID,也就最大的事务ID
  • creator_trx_id:创建read view的事务ID,其实也就是说这个read view是哪一个事务创建的

下面将举个例子来更好的理解

请添加图片描述

​ 假设此时有两个事务在RC的隔离级别下并发的执行,一个事务1执行查询操作,另一个事务2更新了事务1要查询的值,这两个事务都还没有提交,在事务1查询的时候会创建一个Read View,因为是RC隔离级别,所以当事务1查询到值A的时候,发现值A的TRX_ID存在与Read View中的m_ids中,也就是这个数据是脏数据,还没有提交,因此事务1不会去读取这个数据,他会根据ROLL_PTR去查询历史数据,结果查询到值B,因为比Read View中的min_trx_id小而且不在m_ids中,说明在事务1开启之前,更新这行数据的事务肯定是已经提交了的,因此是可以读取的,于是,事务1最终读取到了值B

​ 通过上面的例子,相信大家对与Read View的作用有了初步的认识,有了Read View,就可以根据隐藏字段得到哪些数据是可以读取的,如果没有找到,就会沿着undo log版本链去找,然后再根据Read View去判断。

六、小结

​ 本篇文章介绍了实现MVCC的三个关键要素——隐藏字段、undo log版本链和Read View机制,他们共同所实现了MVCC,实现了在多个事务并发读-写的场景下读操纵不需要因为写操作的枷锁而等待,大大地提高了数据库的并发性。本篇文章在最后介绍Read View的时候只介绍了RC隔离级别下的例子,其实MVCC除了可以实现RC,还可以实现RU和RR,对于RR级别我这里就不做过多的介绍了,相信只要理解了RC的例子,这个也是很容易的

​ 如果本篇文章由不对的地方,希望能指出,大家一起学习共同进步

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

生命中有太多不确定

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

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

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

打赏作者

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

抵扣说明:

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

余额充值