mysql的MVCC机制详解

article/2025/9/15 11:52:40

文章目录

    • 1. 什么是MVCC机制?
    • 2. MVCC机制底层是怎么实现的
      • 2.1 undo日志版本链
      • 2.2 read view机制
    • 3. undo版本链和read-view的对比规则
    • 4. 结合案例解释mvcc机制实现可重复读过程

1. 什么是MVCC机制?

首先来重新认识一下可重复读和串行化:

  • 可重复读mysql的默认隔离级别是可重复读,也就是在一个事务中,多次查询结果都相同。就算有其他事务修改了数据,也不会影响当前事务的查询结果。读操作不加锁,使用mvcc机制
  • 串行化:读和写操作也加行锁,其他事务的所有读写操作都会被阻塞。

        可重复读和串行化其实都是为了保证多次读到的数据一致,确保了隔离性。如果没有隔离性保障,那当其他事务修改数据时,java代码中的数据就在不断变化,就无法写代码了。

        可重复读的这个隔离性就是靠MVCC(Multi-Version Concurrency Control)机制来保证的,对一行数据的读和写两个操作默认是不会通过加锁互斥来保证隔离性,避免了频繁加锁互斥。而在串行化隔离级别为了保证较高的隔离性是通过将所有操作加锁互斥来实现的,频繁加锁导致效率低下!

注意:mysql在读已提交可重复读 两个隔离级别都实现了MVCC机制!
                
        

2. MVCC机制底层是怎么实现的

mvcc机制其实就是通过undo日志版本链read view机制来实现的!

        

2.1 undo日志版本链

undo日志版本链的作用:记录某个数据历次被修改的版本,并通过回滚指针连接起来,当发生数据回滚时可以通过undo版本链恢复到以前的数据。

如图:开启一个事务(还未提交),对id = 1 的数据不停的修改,则会生成一个undo版本链,记录当前事务中id = 1 的数据的各个版本,后期可直接回滚到某个版本!
在这里插入图片描述

        比如下完订单会减库存,减完库存之前的值会记录在undo日志里,如果减完库存后边的业务抛异常了,数据库库存数据会回滚,怎么回滚,就是通过undo日志版本来找到记录在undo日志中的老数据!

        一行数据被多个事务依次修改过后,在每个事务修改完后,Mysql会保留修改前的数据undo回滚日志,并且用两个隐藏字段trx_idroll_pointer把这些undo日志串联起来形成一个历史记录版本链(见下图)

  • trx_id:事务id,用来记录当前事务的id,同一个事务中的不同操作,id一致,事务id是递增的。
  • roll_pointer:行指针。通过roll_pointer来找到上一次修改的行,方便日志回滚和 read_view 判断(下边会讲)

注意:
        begin 开启事务命令并不是一个事务的起点,在执行到它们之后的第一个修改操作InnoDB表的语句, 事务才真正启动,才会向mysql申请事务id,mysql内部是严格按照事务的启动顺序来分配事务id的。

  • ①:undo日志版本链同一条数据只有一个
  • ②:查询不会产生undo日志版本链

        

2.2 read view机制

        
read view一致性视图的生成时机:

  • ①:在可重复读隔离级别,当前事务中,每次执行查询sql时都只会使用第一次生成的一致性视图 read-view,该read-view视图在事务结束前都不会变化。注意:begin开启事务时并不会生成一致性视图,只有查询语句开始执行时才会生成
  • ②:在读已提交隔离级别,当前事务中,每次执行查询sql时都会生成一个一致性视图read-view,该read-view视图在每次查询时都会重新生成

由以上两点区别,导致不同的隔离级别查询结果不一致!

        
一致性视图 read-view 由什么组成?

read-view一般由两部分组成:

  • ①:一部分由执行查询时所有未提交事务id数组 =【100,200】(数组里最小的id为min_id)
  • ②:另一部分是已提交的最大事务id = 300(max_id),因为trx_id在数据库中是递增的。
    如下图:
    在这里插入图片描述

如上图所示,

  1. 只有查询事务开启的时候会生成一个一致性视图read-view,【100,200】,300。
  2. 而undo版本链中存储的是每一次修改的结果(包括已提交和未提交的操作)
  3. 事务里的任何sql查询结果需要从对应版本链里的最新数据开始逐条跟read-view做比对从而得到最终的快照结果。

        

3. undo版本链和read-view的对比规则

可见:可查询到的数据
不可见:不可查询到的数据

在查询事务中的对比规则如下:

  • ①:从undo日志版本链中自上而下取第一个数据版本的事务id,拿着事务id(trx_id)去跟read-view的三个区域做对比,三个区域如下图

  • ②:如果 trx_id 落在绿色部分( trx_id < read-viewmin_id 100 ),表示这个版本是已提交的事务生成的,这个数据是可见的;

  • ③:如果 trx_id 落在红色部分( trx_id>read-viewmax_id 300 ),表示这个版本是由将来启动的事务生成的,是肯定不可见的;

  • ④:.如果 trx_id 落在黄色部分(min_id 100 <= trx_id <= max_id 300),那就包括两种情况 :

    • --------a. 若 trx_id 在视图数组【100,200】中,表示这个版本是由还没提交的事务生成的,不可见,当前自己的事务是可见的;
    • --------b. 若 trx_id 不在视图数组【100,200】中,表示这个版本是已经提交了的事务生成的,可见。
      在这里插入图片描述

        

4. 结合案例解释mvcc机制实现可重复读过程

如下图所示红框内select1的read-view视图内容包括未提交的事务【100,200】和已提交的最大事务 300。所以read-view为【100,200】,300
在这里插入图片描述
对应的undo版本链和一致性视图如下所示:
在这里插入图片描述
由undo版本链一致性视图read-view对比即可查得当前数据!

查询流程如下:

  • ①:事务100 、200、300由于是对id = 1的数据的修改操作,修改记录会被被记录在undo日志版本链中
  • ②:然后开启一个事务,查询id = 1的数据,此次查询操作在可重复读隔离级别下生成了一个read-view一致性视图,该read-view视图由 未提交的事务id数组和已创建的最大事务id,为:【100,200】,300
  • ③:查询结果就是undo日志版本链 与 read-view对比的结果,对比过程就是如下:
    • (1)mysql底层根据read-view【100,200】300生成三个范围区间,如上图所示。
    • (2)然后去undo版本链中从上向下找到第一个数据版本,也就是1 - lilei300 - 300 这个数据版本,因为id = 300这个事务最后修改的数据,位于undo日志版本链的最顶端,所以被第一个取出,取出事务id 300.
    • (3)拿事务id 300 去范围区间内查找。如果落在绿色部分(事务id<100),则直接可见,查询结束.但查找结果发现300落在黄色部分【100,200】,300,此时还有两种情况:
      • ------ a:如果事务id落在未提交事务数组【100,200】中,则代表结果不可见,300并未落在该区间
      • ------ b:如果事务id没有落在未提交事务数组【100,200】中,则代表已提交的事务,结果是可见的。300刚好落在黄色取域【100,200】,300中的未提交事务数组【100,200】之外,对比结果就是undo日志版本链上的事务id = 300的这条数据在本次查询中是可见的!
  • ④:查询结果因为等于 undo日志版本链 与 read-view对比的结果,所以查询结果就是lilei300

后续有别的查询同样根据这些规则去比对 产生查询结果!

注意:

  • 可重复读隔离级别下:一个事务中,多次查询的read-view不变
  • 读已提交隔离级别下:一个事务中,每次查询的read-view都会改变!

http://chatgpt.dhexx.cn/article/fthsXDEP.shtml

相关文章

认真学习MySQL中的MVCC机制

什么是MVCC&#xff1f;MVCC&#xff08;Multiversion Concurrency Control&#xff09;&#xff0c;多版本并发控制。顾名思义&#xff0c;MVCC是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性操作有了保证。换言之&#…

MVCC的含义,如何实现的?

欢迎大家关注我的公众号【老周聊架构】&#xff0c;Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。 一、MVCC简介 1、什么是MVCC MVCC(Multi Version Concurrency Control的简称)&#xff0c;代表多版本并发控制。与MVCC相对的&…

MySQL的MVCC机制

系列文章&#xff1a;关系型/非关系型【数据库】知识脉络 目录 MVCC翻译成中文是&#xff1f; MVCC(Multi-Version Concurrency Control) 回顾事务 MVCC是单打独斗吗&#xff1f; undo日志版本链 read view机制详解 MVCC机制是拿undo日志链和read-view对比 比对规则&…

什么是MVCC机制?

什么是MVCC机制&#xff1f; 什么是MVCC多版本并发控制机制 之前我们讲到&#xff0c;事务在并发环境下会带来脏读、脏写、不可重复读等诸多问题&#xff0c;为了解决这些问题&#xff0c;保证事务的ACID特性&#xff0c;出现了诸多隔离级别去解决这些问题&#xff0c;mysql默…

MySQL InnoDB的MVCC实现机制

MySQL InnoDB的MVCC实现机制 1.MVCC概述2.MVCC的实现原理隐式字段undo日志Read View(读视图)RR隔离级别的Read View方案 1.MVCC概述 什么是MVCC&#xff1f; MVCC&#xff0c;即多版本并发控制。MVCC是一种并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现…

MVCC原理以及隔离机制

1、mysql是如何进行数据回滚的 mysql使用了大量的 undo日志、trx_id 字段以及 roll_pointer 字段来实现的数据回滚。版本链比对规则图&#xff1a; 查询 ​ 当mysql开启一个查询时 遇到的select语句会创建一个 read-view 一致性视图&#xff0c;这个视图里面保存 一个未提交…

【MVCC多版本并发控制】MVCC 机制的原理及实现,什么是MVCC,多版本并发控制

什么是 MVCC MVCC (Multiversion Concurrency Control) 中文全程叫多版本并发控制&#xff0c;是现代数据库&#xff08;包括 MySQL、Oracle、PostgreSQL 等&#xff09;引擎实现中常用的处理读写冲突的手段&#xff0c;目的在于提高数据库高并发场景下的吞吐性能。 如此一来…

MySql的MVCC实现机制

MVCC实现机制 快照读和当前读MVCC 快照读和当前读 在了解MySql的MVCC实现之前&#xff0c;需要先了解什么是快照读和当前读&#xff0c;以便于后续讲解 快照读&#xff1a;就是单纯的 SELECT 语句&#xff0c;不包括下面这两类语句: SELECT ... FOR UPDATE SELECT ... LOCK I…

MVCC机制略解

在mysql中&#xff0c;默认的隔离级别是可重复读。即在一个事物中读取到的数据总是一样的&#xff0c;即使其他事务把数据改了&#xff0c;那在这个事务中读取的数据还是第一次读取的数据。 mysql还可以设置为读已提交隔离级别。即一个事务中读取的数据&#xff0c;随着其他事务…

什么是MVCC,一文搞懂MySQL的MVCC机制

MVCC是什么 MVCC&#xff0c;即Multi-Version Concurrency Control &#xff08;多版本并发控制&#xff09;。它是一种并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现对数据库的并发访问&#xff0c;在编程语言中实现事务内存。 数据库中同时存在多个版本…

对MVCC全面解析

简介 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;即多版本并发控制。 MVCC的实现原理 我们在了解MVCC之前&#xff0c;首先先了解一下几个比较常见的锁。 读锁&#xff1a;也叫共享锁、S锁&#xff0c;若事务T对数据对象A加上S锁&#xff0c;则事务T可…

【MySQL】MVCC机制

什么是MVCC MVCC 英文全称&#xff1a;Multi-Version Concurrency Control&#xff0c;Mysql的事务隔离性就是主要靠MVCC机制来实现的。对一行数据的读和写默认是不会通过加锁互斥来保证隔离性的&#xff0c;这样避免了频繁的加锁互斥&#xff0c;而在串行化隔离级别为了保证较…

一文精通MVCC机制

MVCC(Multi-Version Concurrency Control)多版本并发控制机制 使用串行化隔离级别时&#xff0c;mysql会将所有的操作加锁互斥&#xff0c;来保证并发安全。这种方式必然降低并发性能。mysql在读已提交和可重复读隔离级别下&#xff0c;对一行数据的读和写两个操作默认是不会通…

数据库的MVCC机制

MVCC 1. 什么是MVCC MVCC &#xff08;Multiversion Concurrency Control&#xff09;&#xff0c;多版本并发控制。顾名思义&#xff0c;MVCC 是通过数据行的多个版 本管理来实现数据库的 并发控制 。这项技术使得在InnoDB的事务隔离级别下执行 一致性读 操作有了保 证。换言…

MySQL之MVCC机制

1. MVCC概念 MVCC&#xff0c;全称Multi-Version Concurrency Control&#xff0c;即多版本并发控制。MVCC是一种并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现对数据库的并发访问&#xff0c;在编程语言中实现事务内存。 在Mysql的InnoDB引擎中就是指在…

【MySQL进阶-05】深入理解mvcc机制(详解)

MySql系列整体栏目 内容链接地址【一】深入理解mysql索引本质https://blog.csdn.net/zhenghuishengq/article/details/121027025【二】深入理解mysql索引优化以及explain关键字https://blog.csdn.net/zhenghuishengq/article/details/124552080【三】深入理解mysql的索引分类&a…

MVCC及实现原理

&#xff01;首先声明&#xff0c;MySQL 的测试环境是 5.7 前提概要 什么是 MVCC什么是当前读和快照读&#xff1f;当前读&#xff0c;快照读和 MVCC 的关系MVCC 实现原理 隐式字段undo日志Read View整体流程MVCC 相关问题 RR 是如何在 RC 级的基础上解决不可重复读的&#xf…

4gl程式debug常用技巧

1、带参数的D&#xff1a; ‘MISC’表示具体料号传入 2、指定行数设置断点 比如我要在程式axmt360中的211行开始D 进入Debug界面后按ctrlD 弹出界面 输入b 行数 点OK 出现上面表示已设置OK&#xff0c;然后点cancel或叉叉退出 最后点下面按扭&#xff0c;程式跑到210行时自…

【OpenGL】十五、OpenGL 绘制三角形 ( 绘制 GL_TRIANGLE_FAN 三角形扇 )

文章目录 一、绘制 GL_TRIANGLE_FAN 三角形1、绘制 3 个点的情况2、绘制 4 个点的情况3、绘制 5 个点的情况4、绘制 6 个点的情况 二、相关资源 一、绘制 GL_TRIANGLE_FAN 三角形 GL_TRIANGLE_FAN 的绘制规则是 , 以第 1 1 1 个点作为顶点 , 第 1 , 2 , 3 1,2,3 1,2,3 个点组…

Unity3D笔记十八 GL图像库

作者&#xff1a;PEPE 出处&#xff1a;http://pepe.cnblogs.com/ 1、绘制2D图像的时需要使用GL.LoadOrtho()方法来将图形映射到平面中。 2、所有绘制相关的内容都要写在OnPostRender()方法中。 3、有关GL图像库的脚本需要绑定到Hierarchy视图中Camera上&#xff0c;否则无法…