【MySQL】MVCC与Read View

news2025/6/4 11:37:21

目录

一、数据库并发的三种场景

二、读写场景的MVCC

(一)表中的三个隐藏字段

(二)undo 日志

(三)模拟MVCC

(四)Read View

(五)当前读和快照读

三、RC和RR隔离级别的区别


一、数据库并发的三种场景

        数据库作为存储大量数据的介质,一定存在着大量的IO操作,也就是写操作和读操作。

读-读 :不存在任何问题,也不需要并发控制;

读-写 :有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读;

写-写 :有线程安全问题,可能会存在更新丢失问题,比如第一类更新丢失,第二类更新丢失。

        本文主要讨论在读写场景下的并发问题。

二、读写场景的MVCC

        MVCC即多版本并发控制协议,其是 InnoDB 存储引擎为了实现高并发事务处理的核心机制。它通过维护数据的多个版本,使读写操作可以非阻塞并行执行,从而极大提升了数据库的并发性能。

(一)表中的三个隐藏字段

        当新建一个表结构时,除了显示定义的列结构,表中还包含了三个隐藏字段:

  • DB_TRX_ID:6字节,记录最近修改本条记录的事务ID;
  • DB_ROLL_PTR:7字节,回滚指针,记录该条记录的上一版本;
  • DB_ROW_ID:6字节,当数据表没有主键时,InnoDB会自动以 DB_ROW_ID 作为隐藏主键并建立一个聚簇索引。

        例如向一张表插入一条数据时,实际该数据内容为:

nameageDB_TRX_IDDB_ROLL_PTRDB_ROW_ID
张三18最近修改本条记录的事务IDnull(新增数据因此没有上个版本)1(隐藏主键)

        实际数据表还有个删除 flag 隐藏字段,用于表明该条是否有效,也就是删除表中数据时是逻辑删除,之后在合适的时候由 MySQL 再向磁盘刷新数据。

(二)undo 日志

        undo 日志是在 MySQL 中的一段内存缓冲区,用于保存日志文件。其主要由两个核心作用:

  • 事务回滚:
    当事务执行失败或者主动回滚时,undo log 中记录的数据旧版本课用于恢复原始状态。例如:当执行插入数据操作时,undo log 会记录其对应的删除操作,回滚时直接执行该操作删除数据;当执行更新或删除操作时,undo log会记录数据的旧值用于回滚。
    事务在修改数据前,undo log会记录反向操作或数据旧值,形成逻辑日志链。
  • 支持MVCC:
    undo log会存储数据的历史版本,通过隐藏字段 DB_TRX_ID 和 DB_ROLL_PTR串联历史版本,形成链式日志从而支持 MVCC 。详见下文。

(三)模拟MVCC

        假定 student 表中已有数据如下:

        假定有个事务10,对 student 表中记录进行了修改,将姓名修改为了"李四"。当事务10执行完毕后:

        在此过程中,事务10首先会将该条记录加行锁,修改前先将该条记录拷贝到 undo log 中(写时拷贝)。之后将数据修改为目标值并再填写相应的字段,之后事务提交后并释放锁。

        假定现在有个事务11对表中数据进行修改,将年龄改为了20,事务11也会进行以上的操作。当事务11执行完毕后:

        undo log中的一个个版本被称为快照。正如上文所述,除了记录版本链以外,undo log 还会记录相反的操作以备回滚。

        当执行插入操作时,undo log 会基于主键记录对应相反的删除操作;当执行删除操作时会将该记录的删除 flag 字段设置为删除即逻辑删除,并将该条数据记录在 undo log 中;当执行select 操作时,会根据隔离级别执行当前读或者快照读。当前读即读取最新的数据,快照读即读取数据的历史版本。

        针对于 select 操作,在RU隔离级别下所有查询都是读取最新版本的数据,RC和RR隔离级别下所有普通查询都是快照读,而Serializable隔离级别下事务是严格串行执行,因此所有查询操作都是当前读。本文主要讨论如何MVCC 机制如何解决 RC 和 RR隔离级别下的读写并发问题。

        隔离级别和读写并发问题详见:【MySQL】事务及隔离性-CSDN博客

(四)Read View

        Read View 是事务首次进行快照读时由 MySQL 生成的,其主要是配合 MVCC 机制进行版本控制。

        当某个事务执行 select 快照读的时候,MySQL新建一个 Read View 对象,用其内部的字段来判断当前事务应该读取数据的哪个版本,该数据可能是当前最新的数据,也有可能是该行记录的 undo log 里面的某个版本的数据,这由隔离级别决定。

        以下是简化 Read View 的结构体:

class ReadView {
    // 省略...
    private:
    /** 高水位,大于等于这个ID的事务均不可见*/
    trx_id_t m_low_limit_id
    /** 低水位:小于这个ID的事务均可见 */
    trx_id_t m_up_limit_id;
    /** 创建该 Read View 的事务ID*/
    trx_id_t m_creator_trx_id;
    /** 创建视图时的活跃事务id列表*/
    ids_t m_ids;//ids_t集合类型 
    /** 配合purge,标识该视图不需要小于m_low_limit_no的UNDO LOG,
    * 如果其他视图也不需要,则可以删除小于m_low_limit_no的UNDO LOG*/
    trx_id_t m_low_limit_no;
    /** 标记视图是否被关闭*/
    bool m_closed;
    // 省略...
};

m_ids:一张列表,用来维护Read View生成时刻,系统正活跃的事务ID
up_limit_id:记录m_ids列表中事务ID最小的ID
low_limit_id:ReadView生成时刻系统尚未分配的下一个事务ID,也就是目前已出现过的事务ID的最大值+1
creator_trx_id:创建该ReadView的事务ID

        表中的三个隐藏字段配合 Read View 即可完成 MVCC机制。

        当一个事务进行快照读时,MySQL 会为此建立一个 Read View 对象,首先 up_limit_id 字段会记录当前活跃事务的最小事务ID,low_limit_id 会记录当前活跃时最大事务ID值 + 1, 而 m_ids 会记录当前所有活跃的事务ID。例如:当事务10创建 Read View 对象时,假定活跃事务有(8,9,12),那么事务是10对应的字段值分别为:up_limit_id = 8, low_limit_id = 13, m_ids = (8, 9, 12)。

        下面将展开说明 Read View 是如何配合 undo log 实现 MVCC机制的:

        当一个新事务执行普通 select 操作(快照读)时,MySQL 会为此新建并初始化一个 Read View 对象,针对目标数据存在以下的情况:

        若该条记录的 DB_TRX_ID 小于 Read View 中的 up_limit_id 最小事务ID,说明修改该记录的事务在新事务到来之前就已经执行完毕提交了,故该数据可被新事物所见,无需查看该条记录的上一版本了;

        若该条记录的 DB_TRX_ID 大于等于 Read View 中的 low_limit_id 最大事务ID,说明修改该记录的事务在新事务执行查询操作之后才执行完毕(不一定提交),若该条记录存在上一版本,则需通过该条记录的 DB_ROLL_PTR 字段查询上一版本并再次进行比较;若不存在上一版本,则该条记录不可被新事务所见;

        若该条记录的 DB_TRX_ID 处于 up_limit_id 与 low_limit_id 之间,则需要进一步判断。若该条记录的 DB_TRX_ID 存在于 m_ids 列表中,则说明新事务执行查询操作时 DB_TRX_ID 该事务仍处于活跃状态,因此该条记录不可见,需查询该记录上一版本进一步进行判断;若该条记录的 DB_TRX_ID 不存在于 m_ids 列表中,则说明新事务执行查询操作时 DB_TRX_ID 该事务已经执行完毕提交了,则该条记录可以被新事务所见,无需查看该条记录的上一版本了。

(五)当前读和快照读

        在上文中我们铺垫了当前读和快照读的概念,那么应该如何操作呢?以下示例都是在 RR 隔离级别下进行测试。

        两个事务同时开启,由上面两张图可知,MySQL会为快照读建立 Read View 对象,因此不同的读取可能会造成不同的查询结果。(图一是修改年龄为20,但查询结果为18/图二是修改年龄为18,查询结果也为18)

        当前读与快照读:

//当前读
mysql> select * from student lock in share mode;
//快照读
mysql> select * from student;

三、RC和RR隔离级别的区别

        RC和RR隔离级别下在快照读时都会生成 Read View 对象,正是生成 Read View 对象的时机不同,导致快照读的结果不同

在RC隔离级别下:

        每次快照读都会新生成一个快照和Read View, 这就是我们在RC级别下的事务中可以看到别的事务提交的更新的原因,也就是每个快照读都会生成最新的 Read View 对象。正是RC每次快照读,都会形成Read View,所以,RC才会有不可重复读问题

在RR隔离级别下:

        同一个事务中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View。也就是只有第一次进行快照读时才会生成 Read View 对象,此后在调用快照读的时候,还是使用的是同一个Read View,所以只要当前事务在其他事务提交更新之前使用过快照读,那么之后的快照读使用的都是同一个Read View,所以对之后的修改不可 见;

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

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

相关文章

相机--双目立体相机

教程 链接1 教程汇总 立体匹配算法基础概念 视频讲解摄像机标定和双目立体原理 两个镜头。 双目相机也叫立体相机--Stereo Camera,属于深度相机。 作用 1,获取图像特征; 2,获取图像深度信息; 原理 原理和标定 …

多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现

多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现 目录 多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现效果一览基本介绍…

工厂模式 vs 策略模式:设计模式中的 “创建者” 与 “决策者”

在日常工作里,需求变动或者新增功能是再常见不过的事情了。而面对这种情况时,那些耦合度较高的代码就会给我们带来不少麻烦,因为在这样的代码基础上添加新需求往往困难重重。为了保证系统的稳定性,我们在添加新需求时,…

37. Sudoku Solver

题目描述 37. Sudoku Solver 回溯 class Solution {vector<vector<bool>> row_used;vector<vector<bool>> col_used;vector<vector<bool>> box_used;public:void solveSudoku(vector<vector<char>>& board) {row_used.r…

RV1126-OPENCV 图像叠加

一.功能介绍 图像叠加&#xff1a;就是在一张图片上放上自己想要的图片&#xff0c;如LOGO&#xff0c;时间等。有点像之前提到的OSD原理一样。例如&#xff1a;下图一张图片&#xff0c;在左上角增加其他图片。 二.OPENCV中图像叠加常用的API 1. copyTo方法进行图像叠加 原理…

修改 vscode 左侧导航栏的文字大小 (更新版)

1. 起因&#xff0c; 目的: 问题&#xff1a; vscode 左侧的文字太小了&#xff01;&#xff01;&#xff01;我最火的一篇文章&#xff0c;写的就是这个问题。 看来这个问题&#xff0c;是很广泛的一个痛点。我最近更新了 vscode&#xff0c; 这个问题又出现了。再来搞一下。…

云原生 Cloud Native Build (CNB)使用初体验

云原生 Cloud Native Build&#xff08;CNB&#xff09;使用初体验 引言 当“一切皆可云”成为趋势&#xff0c;传统开发环境正被云原生工具重塑。腾讯云CNB&#xff08;Cloud Native Build&#xff09;作为一站式开发平台&#xff0c;试图解决多环境协作难题。 本文将分享c…

格式工厂 FormatFactory v5.20.便携版 ——多功能媒体文件转换工具 长期更新

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://pan.xunlei.com/s/VORWF3Q7D0eCVV06LHbzheD-A1?pwdjikz# 【​本章下载二】&#xff1a;https://pan.quark.cn/s/8ee59ed83658 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…

数据可视化--使用matplotlib绘制高级图表

目录 一、绘制等高线图 contour() 二、绘制矢量场流线图 streamplot() 三、绘制棉棒图 stem() 四、绘制哑铃图 五、绘制甘特图 六、绘制人口金字塔图 barh() 七、绘制漏斗图 简易版漏斗图 八、绘制桑基图 Sankey()---创建桑基图 add()---添加桑基图的选项 finish()…

如何做好一个决策:基于 Excel的决策树+敏感性分析应用

决策点: 开发新产品? (是 / 否) 因素 (如果是): 市场接受度 (高 / 中 / 低);概率: 高(0.3), 中(0.5), 低(0.2) 结果值 (NPV): 高(+$1M), 中(+$0.2M), 低(-$0.5M) 不开发成本/收益: $0 开发计算: EMV(市场接受度) = (0.3 * 1M) + (0.5 * 0.2M) + (0.2 * -0.5M) = $0.3M + $…

【模拟电子电路-工具使用】

模拟电子电路-工具使用 ■ 1. 模拟软件■ 1. circuit JS ■ 2. 万用表■ 3. 示波器■ 4.■ 5.■ 6.■ 7. ■ 1. 模拟软件 ■ 1. circuit JS ■ 2. 万用表 ■ 3. 示波器 ■ 4. ■ 5. ■ 6. ■ 7.

[ElasticSearch] ElasticSearch的初识与基本操作

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

搜索引擎2.0(based elasticsearch6.8)设计与实现细节(完整版)

1 简介 1.1 背景 《搜索引擎onesearch 1.0-设计与实现.docx》介绍了1.0特性&#xff0c;搜索schema&#xff0c;agg&#xff0c;表达式搜索映射&#xff0c;本文介绍onesearch 2.0 新特性, 参考第2节 规划特性与发布计划 1.2 关键词 文档 Document elasticsearch 一行数据称为…

Go 即时通讯系统:客户端与服务端 WebSocket 通信交互

客户端和服务端的交互 客户端与服务端建立连接 客户端&#xff1a;客户端通过浏览器或者其他应用程序发起一个 HTTP 请求到服务端的 /socket.io 路径。在请求中会携带用户的 UUID 作为参数&#xff08;通过 c.Query("user") 获取&#xff09;。 // router/socket.…

某航后缀混淆逆向与顶像风控分析

文章目录 1. 写在前面2. 接口分析3. 加密分析4. 风控分析 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致…

[Protobuf]常见数据类型以及使用注意事项

[Protobuf]常见数据类型以及使用注意事项 水墨不写bug 文章目录 一、基本数据类型1、字段2、字段的修饰规则 二、自定义数据类型1、message类型2、enum类型3、Any类型4、oneof类型5、map类型 三、小工具1.hexdump2.decode 四、注意事项 一、基本数据类型 protobuf 支持多种基础…

模拟实现线程池(线程数目为定值)和定时器

前言 昨天学习关于定时器的相关知识。今天花时间去模拟实现了一个定时器&#xff0c;同时也去模拟实现了一个线程池(线程数目为定值)。我感觉我收获了很多&#xff0c;对于线程的理解加深了。跟大家分享一下~ 线程池和定时器(这个是主要)的实现 代码 线程池 import java.ut…

数据结构之队列实验

引言 在计算机科学中&#xff0c;进制转换是基础但重要的操作。例如将一个十进制数转换为二进制或八进制表示时&#xff0c;我们通常使用“短除法”——即不断用目标进制去除当前数&#xff0c;记录余数&#xff0c;直到商为0为止。 这种方法得到的是低位先产生的结果&#x…

【Ubuntu】摸鱼技巧之虚拟机环境复制

前言 提示&#xff1a;所有的操作都需要关闭虚拟机 如何快速在其它电脑布置&#xff0c;linux环境&#xff0c;如果我们有一个环境直接拷贝就有时间摸鱼呀。 1.直接复制简单粗暴 不做赘述&#xff0c;如果不会复制&#xff0c;那么请右击鼠标压缩复制 2.克隆虚拟机 2.1 …

室内VR全景助力房产营销及装修

在当今的地产行业&#xff0c;VR全景已成为不可或缺的应用工具。从地产直播到楼市VR地图&#xff0c;从效果图到水电家装施工记录&#xff0c;整个地产行业的上下游生态中&#xff0c;云VR全景的身影无处不在。本文将探讨VR全景在房产营销及装修领域的应用&#xff0c;并介绍众…