了解 MySQL 中 MVCC 的原理

news2024/11/25 11:53:01

点击上方“追梦 Java”关注,一起追梦!

94b1c60ded1931afa1d9ff09fe9b47f1.png

要解决读一致性的问题,保证一个事务中前后两次读取数据结果一致,还有一种 MVCC 的方式,又叫多版本的并发控制(Multi Version Concurrency Control)。

MVCC 就是为了让一个事务前后两次读取到的数据保持一致,在修改数据的时候给它建立一个快照,后面的查询操作读取这个快照就可以了。MVCC 解决了加上排他锁后的行记录,可以被查询到的问题,从而解决了由于写操作阻塞而引发读操作并发的问题。

InnoDB 为每一行记录都默认生成两个隐藏列:DATA_TRX_ID 、 DATA_ROLL_PTR 。

DATA_TRX_ID,记录最新插入或者更新这条行记录的事务 ID ,大小为 6 个字节,事务编号是自动递增的(我们把它理解为创建版本号,在数据新增或者修改为新数据的时候,记录当前事务 ID)。

DATA_ROLL_PTR,表示指向该行回滚段 (rollback segment) 的指针,大小为 7 个字节,InnoDB 便是通过这个指针找到之前版本的数据,我们把它理解为回滚版本号。该行记录的所有旧版本,在 undo 中都通过链表的形式组织。

1

MVCC 的原理讲解

aeaad37bf00829f358547470d10ef593.png

第一个事务:

begin; 
insert into person values(1,'张三'); 
insert into person values(2,'李四'); 
commit;

此时的数据,创建版本是当前事务ID,删除版本为空,如下表:

c2676c5896342e0efea41bea01d62243.png

第二个事务:执行第 1 次查询,读取到两条原始数据,是“张三”和“李四”两个数据,这个时候事务 ID 是 2,

select * from person;

第三个事务,插入数据:

begin; 
insert into person values(3,'王五'); 
commit;

此时的数据,多了一条“王五”,它的创建版本号是当前事务编号 3,如下表:

2906dae87b373b50cc18605913f4151c.png

第二个事务,执行第 2 次查询:

select * from person;

MVCC 的查找规则:只能查找创建时间小于等于当前事务 ID 的行,和删除时间大于当前事务 ID 的行(或者回滚版本为空的行)。

因此以上的过程不能查到第三个事务插入的数据“王五”,“王五”的创建版本号为 3 大于第二个事务的 ID 2,所以还是只能查到创建版本号为 1 的两条数据,即“张三”和“李四”两个数据。

第四个事务,删除数据,删除了 id = 2 的“李四”的这条记录,

begin;
delete from mvcctest where id = 2;
commit;

 此时的数据,“李四”的回滚版本号被记录为当前事务 ID 4,其他数据不变,如下表:

41f4a1aabada1978aaa4da9dffdd6e90.png

在第二个事务中,执行第 3 次查询:

select * from person;

MVCC 的查找规则:只能查找创建时间小于等于当前事务 ID 的行,和删除时间大于当前事务 ID 的行(或者回滚版本为空的行)。

因此以上的过程能查到第四个事务删除的数据“王五”,“王五”的回滚版本号 为 4 大于第二个事务的 ID 2,所以还是只能查到创建版本号为 1 的数据和回滚版本号为 4 的数据,还是“张三”和“李四”两个数据。

第五个事务,执行更新操作,这个事务 ID是5,

begin; 
update person set name = '赵六' where id = 1;
commit;

此时的数据,第五个事务更新“张三”数据的时候,旧数据的回滚版本号被记录为当前事务ID 5(同时写入 undo 日志),产生了一条新数据,创建版本号为当前事务ID 5,如下表:

beba1723f76db9b5fd2ee1ca630df1e8.png

第二个事务,执行第 4 次查询,

select * from person;

MVCC 的查找规则:只能查找创建时间小于等于当前事务 ID 的行,和删除时间大于当前事务 ID 的行(或者回滚版本为空的行)。

因此以上的过程不能查到第三个事务插入的数据“王五”,“王五”的创建版本号为 3 大于第二个事务的 ID 2,所以还是只能查到创建版本号为 1 的两条数据,即“张三”和“李四”两个数据。

第五个事务更新后的数据"赵六"的创建版本号大于 2,代表是在第二个事务之后增加的,查不出来,而旧数据“张三”的回滚版本号大于 2,代表是在第二个事务之后删除的,可以查出来。所以还是只能查到创建版本号为 1 的两条数据,即“张三”和“李四”两个数据。

通过以上 MVCC 的讲解,我们能看到,通过创建版本号与回滚版本号的查找规则,无论其他事务是插入、修改、或者删除,第二个事务查询到的数据都没有变化,从而说明 MVCC 解决了读一致性的问题。

需要说明的是,以上的例子是基于第二个事务是查询操作,如果查询操作在插入、修改、或者删除之后,同时这些操作没有提交的情况下,那么按照 MVCC 的查找规则,查询的事务还是不能保证的一致性。

在 InnoDB 存储引擎中,MVCC 是通过 MVCC 的查找规则 结合  Undo Log 一起实现的读一致性。

2

理解 Undo Log、Redo Log 的作用

fa4de9f003b38c69ca66033994b4146c.png

1、了解 Undo Log

Undo Log 是为了实现事务的原子性产生的,在事务开始之前,在对数据进行操作之前,首先需要把操作的数据备份到一个日志文件里,以便在事务处理过程中出现异常或者回退时,MySQL 可以利用 Undo Log 中的备份数据恢复到事务执行前的状态,主要是用于回滚操作。

上面提到的 MVCC 是通过 MVCC 的查找规则 结合  Undo Log 一起实现的读一致性的根本原因在于 Undo  Log 保存了未提交之前的老版本数据,因此可以将其作为老版本快照便于其他事务来进行并发的读操作。

快照读:普通的 select 查询就是快照读,它是由缓存区(Undo buffer)和 undo 区(Undo Log)两部分组成。

当前读:sql 读取的是最新版本的数据,加锁的数据读取都是当前读。

2、了解 Redo Log

Redo Log 是为了实现恢复操作产生的,是为了实现事务的持久性。Redo Log 把事务中操作的任何数据,都把最新的数据备份到一个日志文件里,它不是事务提交后才写入日志文件,而是在事务的执行过程中就开始写入 Redo Log。

Redo Log 实现事务的持久性是指在发生故障的时候,如果有脏页没有写入磁盘,在重启 MySQL 服务的时候,根据 Redo Log 进行重做,从而把没有写入磁盘数据进行持久化的操作。

8ca15129ca2f6b219d0fec977230d4df.png

后面将为大家介绍 SQL 语句调优 explain 的用法

有用的话点个在c9f00c6a40889dc3b197da09500c5004.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/795696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flink状态的理解

Flink是一个带状态的数据处理系统;系统在处理数据的过程中,各算子所记录的状态会随着数据的处理而不断变化; 1. 状态 所谓状态State,一般指一个具体的 Task 的状态,即线程处理过程中需要保存的历史数据或历史累计数据…

SpringBoot集成Redis的环境部署以及操作Redis

文章目录 Spring Boot 集成Redis1.环境配置 redis连接配置信息不写默认wei6379,数据库为02.操作Redis2.1 代码形式操作Redis2.2 使用注解方式操作Redis Spring Boot 集成Redis 1.环境配置 添加redis依赖 在老项目添加,可以在pom.xml文件直接添加&#…

DAMO-YOLO 论文学习

1. 解决了什么问题? 工业界追求高性能、低延迟的目标检测算法,研究人员于是聚焦于单阶段目标检测,探索高效的网络结构和训练策略。YOLOv5/v6/v7、YOLOX 和 PP-YOLOE 在 COCO 数据集上实现了不错的精度-速度平衡,得到广泛应用&…

超标量处理器寄存器rename

1.相关性介绍 在CPU中,一段程序会被编译成一连串的汇编指令,指令与指令之间可能会具有相关性(dependency)。所谓相关性,即一条指令的执行会依赖于另一条指令的结果,相关性可以分为:① 数据相关性…

el-table树形表格实现复选框多选效果

2023.7.26今天我学习了如何使用树形表格的时候进行复选框的多选效果。 当我们使用树形结构表格需要进行多选功能操作的时候会发现点击全选的时候,只有一级表格数据会被选中,问题如图: 我们需要实现的是点击全选的不管是几级表格数据都可以被…

ElasticSearch之IK分词器安装以及使用介绍

文章目录 一、IK 分词器简介1. 支持细粒度分词:2. 支持多种分词模式:3. 支持自定义词典:4. 支持拼音分词:5. 易于集成和使用: 二、安装步骤1、下载 IK 分词器插件:2、安装 IK 分词器插件:3. 安装…

各种知名游戏的技术分析

介绍一个GitHub,里面包括了市面上的各种游戏的技术分析,包括渲染管线、工作流、技术文章等等,在做某个类型的游戏的时候,可以针对某个游戏去进行技术参考,特别实用。 GitHub - OTFCG/Awesome-Game-Analysis: a compre…

C++设计模式之模板方法、策略模式、观察者模式

面向对象设计模式是”好的面向对象设计“,所谓”好的面向对象设计“指的是可以满足”应对变化,提高复用“的设计。 现代软件设计的特征是”需求的频繁变化“。设计模式的要点是”寻求变化点,然后在变化点处应用设计模式,从而更好地…

力扣天天练--week3-LeetCode75

topic75-9-t443:压缩字符串 题目描述: 给你一个字符数组 chars ,请使用下述算法压缩: 从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 : 如果这一组长度为 1 ,则将字符追加到 s 中。 否则,需…

Spring Boot中整合MyBatis(基于xml方式基于注解实现方式)

一、前提准备 在Spring Boot中整合MyBatis时,你需要导入JDBC(不需要手动添加)和Druid的相关依赖。 JDBC依赖:在Spring Boot中整合MyBatis时,并不需要显式地添加JDBC的包依赖。这是因为,当你添加mybatis-sp…

会捷通云视讯 list 目录文件泄露漏洞

劳动永远是医治精神创伤的良药。 漏洞描述 会捷通云视讯某个文件 list参数 存在目录文件泄露漏洞,攻击者通过漏洞可以获取一些敏感信息 漏洞复现 构造payload访问漏洞url: /him/api/rest/V1.0/system/log/list?filePath../漏洞证明: 文…

Mendix 创客访谈录|综合业务展示大屏应用开发

本期创客 刘书智 西门子工业领域专家 我在西门子工厂自动化工程有限公司工作。一直从事SCADA产品的技术支持工作,已经过去17个年头了。赶上数字化发展的浪潮,不断学习各种IT技术,践行 IT与OT融合,希望借助自己的IT知识助力OT的发…

编程实战班--C语言和Python语言实现五子棋游戏的代码

文章目录 下面分别是C语言和Python语言实现五子棋游戏的代码:C语言实现Python语言实现总结 下面分别是C语言和Python语言实现五子棋游戏的代码: C语言实现 在使用C语言实现五子棋游戏时,可以使用SDL2图形库来实现图形界面和图形绘制等功能&…

华为华三思科 交换机基础配置一览

console密码修改 华为 user-interface console 0 authentication-mode password set authentication password cipher XXXXXXXXX华三 line aux 0 authentication-mode password set auth pass simple XXX思科 en configure terminal line console 0 password 123 login忘记…

打开英雄联盟提示d3dcompiler47.dll缺失怎么修复

1.d3dcompiler_47.dll缺失的原因 损坏的文件:d3dcompiler_47.dll文件可能由于某些原因损坏,如病毒感染、意外删除等。 不兼容的操作系统:某些应用程序要求特定版本的d3dcompiler_47.dll文件,如果操作系统不兼容,则可能…

前端实现导出excel表格(单行表头)

需求:实现勾选行导出为表格 一、安装插件 npm install --save file-saver xlsx运行项目报如下警告的话 运行npm install xlsx0.16.0 --save 来降低版本号(最初我安装的版本号是0.18.16的版本)再次运行项目就不会报如下警告了 二、新建一个ex…

语音分帧简述

目录 1. 分帧 1.1 非整齐分帧 1.2 整齐分帧 2. 示例代码 1. 分帧 问题1:总帧数如何计算? 记符号N为语音总长度,FRAME_LEN为帧长,OVERLAP_LEN为帧与帧之间的重叠部分,STEP_LEN为帧移(步长)。则总帧数N_Frames计算…

kotlin 编写一个简单的天气预报app(二)

增加界面显示openweathermap返回的信息。 在activity_main.xml里增加输入框来输入城市&#xff0c;在输入款旁边增加搜索按钮来进行查询。 然后原来显示helloworld的TextView用来显示结果。 1. 增加输入城市名字的EditText <EditTextandroid:id"id/editTextCity"…

AcrelEMS企业微电网能效管理平台实现用户侧智能配电和智能用电管理-安科瑞黄安南

摘要&#xff1a;随着科技的发展&#xff0c;电力系统正逐步向智能化、数字化、互联网化迈进。智能配电与智能用电是电力产业发展的重要方向&#xff0c;将为传统电力系统带来革命性的变革。本文将对智能配电和智能用电的概念、特点、关键技术及应用进行详细介绍。 1、智能配电…

Rust vs Go:常用语法对比(八)

题目来自 Golang vs. Rust: Which Programming Language To Choose in 2023?[1] 141. Iterate in sequence over two lists Iterate in sequence over the elements of the list items1 then items2. For each iteration print the element. 依次迭代两个列表 依次迭代列表项1…