当前位置: 首页 > article >正文

【MySQL】MVCC与Read View

目录

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

二、读写场景的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,所以对之后的修改不可 见;

相关文章:

【MySQL】MVCC与Read View

目录 一、数据库并发的三种场景 二、读写场景的MVCC (一)表中的三个隐藏字段 (二)undo 日志 (三)模拟MVCC (四)Read View (五)当前读和快照读 三、RC和…...

相机--双目立体相机

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

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

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

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

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

23、Swift框架微调实战(3)-Qwen2.5-VL-7B LORA微调OCR数据集

一、模型介绍 Qwen2.5-VL 是阿里通义千问团队开源的视觉语言模型,具有3B、7B和72B三种不同规模,能够识别常见物体、分析图像中的文本、图表等元素,并具备作为视觉Agent的能力。 Qwen2.5-VL 具备作为视觉Agent的能力,可以推理并动态使用工具,初步操作电脑和手机。在视频处…...

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…...

C# Renci.SshNet 登陆 suse配置一粒

C# 调用Renci.SshNet 的SSH类库&#xff0c;登陆 suse linux系统&#xff0c;如果没有配置&#xff0c;会报错&#xff1a; Renci.SshNet.Common.SshAuthenticationException: No suitable authentication method found to complete 1、需要root登陆os,配置 /etc/ssh/sshd_con…...

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; 这个问题又出现了。再来搞一下。…...

从C++编程入手设计模式2——工厂模式

从C编程入手设计模式 工厂模式 ​ 我们马上就要迎来我们的第二个创建型设计模式&#xff1a;工厂方法模式&#xff08;Factory Method Pattern&#xff09;。换而言之&#xff0c;我们希望使用一个这样的接口&#xff0c;使用其他手段而不是直接创建的方式&#xff08;说的有…...

云原生 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()…...

卷积神经网络(CNN)完全指南:从原理到实战

卷积神经网络(CNN)完全指南&#xff1a;从原理到实战 引言&#xff1a;为什么CNN改变了计算机视觉&#xff1f; 2012年&#xff0c;AlexNet在ImageNet竞赛中以压倒性优势获胜&#xff0c;将错误率降低了近10个百分点&#xff0c;这标志着卷积神经网络(CNN)时代的开始。如今&a…...

如何做好一个决策:基于 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与…...

Spring AI 代理模式(Agent Agentic Patterns)

一、Agentic Patterns 核心思想 根据Anthropic《构建高效代理》研究报告&#xff0c;高效LLM代理的设计应遵循两大核心原则&#xff1a; 简单性优先&#xff1a;避免过度设计&#xff0c;从最简单的解决方案开始可组合性&#xff1a;通过模块化设计实现灵活组合而非复杂框架 …...

搜索引擎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 一行数据称为…...

ps中前景色和背景色

在Photoshop&#xff08;简称PS&#xff09;中&#xff0c;前景色和背景色是两个非常重要的概念&#xff0c;它们直接影响着绘图、填充、渐变等操作的最终效果。以下是对前景色和背景色的全面、深入解释&#xff1a; 一、前景色与背景色的定义 前景色&#xff1a;指的是当前绘…...

网页前端开发(基础进阶2--JS)

前面学习了html与css&#xff0c;接下来学习JS&#xff08;JavaScript与Java无关&#xff09;。 web标准&#xff08;网页标准&#xff09;分为3个部分&#xff1a; 1.html主要负责网页的结构&#xff08;页面的元素和内容&#xff09; 2.css主要负责网页的表现&#xff08;…...

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

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

2025年5月AI科技领域周报(5.19-5.25):大模型多模态突破 具身智能开启机器人新纪元

2025年5月AI科技领域周报&#xff08;5.19-5.25&#xff09;&#xff1a;大模型多模态突破 具身智能开启机器人新纪元 目录 2025年5月AI科技领域周报&#xff08;5.19-5.25&#xff09;&#xff1a;大模型多模态突破 具身智能开启机器人新纪元一、本周热点回顾1. 百度发布全球首…...

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

文章目录 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 支持多种基础…...

【C/C++】面试基础题目收集

C 软件开发面试中常见的刷题题目通常可分为以下几大类&#xff1a;数据结构与算法、系统编程、面向对象设计、C 语言特性、并发编程等。 &#x1f9e0; 一、数据结构与算法&#xff08;力扣/牛客经典题&#xff09; 掌握 STL 和底层结构实现能力&#xff1a; &#x1f4cc; 数…...

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

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

数据结构之队列实验

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

Java求职者面试题详解:计算机网络、操作系统、设计模式与数据结构

Java求职者面试题详解&#xff1a;计算机网络、操作系统、设计模式与数据结构 第一轮&#xff1a;基础概念问题 1. 请解释什么是HTTP协议&#xff1f; HTTP&#xff08;HyperText Transfer Protocol&#xff09;是一种用于传输超文本的协议&#xff0c;它定义了客户端和服务…...

每日八股文6.1

每日八股-6.1 Go1.Sync.map的底层实现2.结构体的tag如何获取&#xff1f;3.Go实现单例模式&#xff08;使用sync.Once&#xff09;4.Go实现单例模式&#xff08;不使用sync.Once&#xff09;5.make和new的区别6.Go项目引用包为什么用_以及包的init()函数7.如何判断一个结构体是…...