首页 > 数据库 >MySQL MVCC 详解

MySQL MVCC 详解

时间:2024-09-18 19:50:35浏览次数:3  
标签:事务 log 记录 MVCC undo 详解 MySQL ID

文章目录

MVCC 基本概念

当前读

读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select…lock in share mode(共享锁),select…for update、update、insert、delete(排他锁)都是一种当前读。

快照读

简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。

Read Committed:每次select,都生成一个快照读。

RepeatableRead:开启事务后第一个select语句才是快照读的地方。

Serializable:快照读会退化为当前读。

演示当前读和快照读的区别:

在这里插入图片描述

MVCC

全称 Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为 MySQL 实现 MVCC 提供了一个非阻塞读功能、一种无锁的实现方式。

MVCC 的具体实现,还需要依赖于数据库记录中的三个隐式字段、undo log日志、readView

MVCC 实现原理

隐藏字段

MySQL 中的行数据,除了我们肉眼能看到的字段之外,其实还包含了一些隐藏字段,它们在内部使用,默认情况下不会显示给用户。如下图除了 id、age、name 用户创建的字段,还有 DB_TRX_ID、DB_ROLL_PTR

在这里插入图片描述

字段含义
DB_TRX_ID最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID。
DB_ROLL_PTR回滚指针,指向这条记录的上一个版本,用于配合undo log,指向上一个版本。
DB_ROW_ID隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段。

undo log 日志

undo 日志(Undo Log)是 MySQL 中的一种重要的事务日志,undo 日志的作用主要有两个方面:

  • 事务回滚:记录数据在执行之前是什么样子的,在 insert、update、delete 的时候产生的便于数据回滚的日志。
  • MVCC 实现:MVCC 是 InnoDB 存储引擎的核心特性之一。通过使用 undo 日志,MySQL 可以为每个事务提供独立的事务视图,使得事务读取数据时能看到一致且符合隔离级别要求的数据版本。

undo log 的版本链

不同事务或相同事务对同一条记录进行修改,会导致该记录的 undo log 生成一条记录版本链表,链表的头部是最新的旧记录,链表的尾部是最早的旧记录,回滚指针指向最近的一次的修改记录。

如下图:

事务 2 将 age 改为 3,修改该行数据时,数据库会先对该行加排他锁,然后把该行数据拷贝到 undo log 中作为旧记录,即在 undo log 中有当前行的拷贝副本,当拷贝完成后,隐藏字段中的 BD_TRX_ID 会自增,DB_ROLL_PTR 回滚指针指向 undo log 的副本记录,即表示我的上一个版本就是它,事务提交后,释放锁。

事务 3、4 同理,指向上一个版本,此时就形成了一条版本链。

在这里插入图片描述

具体流程如下:

  1. 在更新或删除操作之前,MySQL 会将旧值写入 undo log 中。
  2. 当事务需要回滚时,MySQL 会根据事务的 undo log 记录,通过 DB_ROLL_PTR 找到对应的 undo log。
  3. 根据 undo log 中记录的旧值,MySQL 将旧值恢复到相应的数据行中,实现数据的回滚操作。

ReadView

ReadView(读视图)是快照读 SQL 执行时 MVCC 提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。

ReadView 中包含了四个核心字段:

字段含义
m_ids当前活跃的事务ID集合(或者叫未提交的事务ID)
min_trx_id最小活跃事务ID(在m_ids找个最小的)
max_trx_id预分配事务ID,就是当前最大事务ID+1(因为事务ID是自增的)
creator_trx_idReadView 创建者的事务ID

其中版本链数据访问规则为:

在这里插入图片描述

不同的隔离级别,生成 ReadView 的时机不同:

READ COMMITTED:在事务中每一次执行快照读时生成ReadVieW。

REPEATABLE READ:仅在事务中第一次执行快照读时生成ReadView,后续复用该 ReadView,所以才叫可以重复读。

RC 隔离级别下的 MVCC

在这里插入图片描述

以第一次查询为例:

trx_id(当前事务ID):4 -> 3 -> 2 -> 1

m_ids(当前活跃的事务ID集合):{3,4,5}

min_trx_id(最小活跃事务ID):3

max_trx_id(预分配事务ID,当前最大事务ID+1):6

creator_trx_id(ReadView创建者的事务ID):5

从条件一至到条件四,trx_id一直从 4 -> 3 -> 2 -> 1,只要有规则成立的就返回当条记录

在图上例子中,当 trx_id 等于 2 的时候,trx_id < min_trx_id 成立了,所以就返回该条记录

RR 隔离级别下的 MVCC

在 RC 隔离级别,同一个事务中读取两次相同的记录是一样的,因为在第一次读取数据时生成一个 ReadView,后面会复用第一次生成的,所以才叫可重复读。

在这里插入图片描述

标签:事务,log,记录,MVCC,undo,详解,MySQL,ID
From: https://blog.csdn.net/m0_72918997/article/details/142341677

相关文章

  • 2024Mysql And Redis基础与进阶操作系列(2)作者——LJS[含MySQL登录;DDL;DML;举例说明;编码
    目录1.MySQL的登录1.1服务的启动和停止方式1:使用图形界面工具步骤1:打开windows服务 步骤2:找到MySQL80(点击鼠标右键)→启动或停止(点击)编辑补充说明2点:1.2自带客户端的登录与退出登录方式1:MySQL自带客户端注意:退出登录2MySQL数据库基本操作-DDL和DML2.1.DDL解释2.......
  • Failed to start docker.service — 完美解决方法详解 ️
    ......
  • MySQL数据库select语句详细用法三(子查询及其select练习)
    SELECT*FROMstudent2WHEREage> (SELECTageFROMstudent2WHERENAME='欧阳丹丹')首先解释一下括号中的代码,意思是在查询student2中的name为欧阳丹丹的人的名字,然后解释一下整个语句的意思:在括号中查询出来的字段中再次进行查询在student2中age大于name为欧阳丹丹的......
  • Java JNA、JNI、ProcessBuilder、Runtime.getRuntime.exec()详解
    Java提供了几种方式与非Java代码进行交互(比如调用本地库或执行外部程序),其中包括JNA、JNI、ProcessBuilder和Runtime.getRuntime().exec()。下面是对每种方式的详细解释。1.JNA(JavaNativeAccess)简介JNA是Java与本地代码进行交互的一种高层次API,它允许Java......
  • canal+ftp实现mysql数据跨网同步
    canal服务端编辑my.ini文件,保存后重启mysql,执行showvariableslike'log_bin'; 显示on代表开启#打开binloglog-bin=mysql-bin#选择ROW(行)模式binlog-format=ROW#配置MySQLreplaction需要定义,不要和canal的slaveId重复server_id=1#binlog文件最大值max_binlog_......
  • AI应用启动失败?专业级详解DLL文件缺失原因及下载修复步骤
    当AI应用(如AdobeIllustrator、深度学习框架等)启动失败,并提示DLL文件缺失时,这通常是由于多种原因导致的。以下是对这一问题的专业级详解,包括缺失原因及下载修复步骤。DLL文件缺失原因程序漏洞:软件本身存在漏洞,可能导致DLL文件在安装或使用过程中丢失。恶意软件攻击:恶意软件......
  • 大数据-128 - Flink 并行度设置 细节详解 全局、作业、算子、Slot
    点一下关注吧!!!非常感谢!!持续更新!!!目前已经更新到了:Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis(已更完)Kafka(已更完)Spark(已更完)Flink(正在更新!)章节内容上节我们完成了如下的内容:ManageOperatorStateStateBackendCheckpoint......
  • 使用客户端连接Mysql服务器.
    Mysql客户端软件有很多种,这种软件的目的就是为了连接到Mysql服务器,提供了一种图形化界面操作数据库的工具。[1]Navicat[2]Sqlyog[3]mysql黑窗口客户端界面。[4]Idea连接mysql...第一种:第二种:第三种:(这里我们使用idea居多,所以着重的说一下)......
  • 使用Python计算多个集合的交集详解
    集合(Set)是Python中的一种常用数据结构,专门用于存储不重复的元素。在数据处理中,集合操作常被用来处理去重、并集、交集等问题。尤其在处理多个数据集时,交集操作尤为重要,因为它可以帮助我们找到多个集合中都存在的共同元素。本文将详细探讨如何在Python中高效地进行多个集合的交集操......
  • 详解Node.js开发中不可或缺的7个库
            在Node.js开发中,选择合适的库对于提高开发效率和优化应用程序性能至关重要。本文将介绍七个备受关注的Node.js库,它们在各自的领域中展现了出色的功能和性能。这些库分别是:Config、Fetch、Ioredis、Multer、Cache、Fast-xml-parser和Cron。我们将深入了解它们......