Mysql神乎乎的MVCC到底该怎么理解

吃透MySQL(九):MVCC多版本并发控制原理 1、MVCC ​ MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。 MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。 2、当前读 ​ 像select lock in share mode(共享锁), select for update ; up 阅读详情

引言

MVCC即多版本并发控制主要是为了解决数据库中并发事务读写的一致性问题,那么多个事务并发执行的时候事务的隔离到底是怎么实现的呢?Mysql默认的RR隔离级别是怎样避免不可重复读的问题呢?我们好好来分析一下。

 

  • 什么是undo log多版本链

  • MVCC如何保证事务隔离

  • 总结

一、什么是undo log多版本链

 

    Mysql的MVCC机制,以undo log版本链为实现基础。因此要理解MVCC机制,我们得先分析下undo log版本链是个什么东东。Innodb存储引擎给每个数据表都添加了三个隐藏字段:DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID。

 

(1)DB_TRX_ID: 标记更新当前数据记录的transaction id,每处理一个事务,其值自动+1。

(2)DB_ROLL_PTR: 回滚指针,记录了最新一次修改该条记录的undo log,回滚的时候就通过这个指针找到undo log回滚。

(3)DB_ROW_ID: 当数据表没有指定主键时,数据库会自动以这个列来作为主键,生成聚集索引。

 

    假设有如下的一条数据,此时这条数据对应的DB_TRX_ID为10,由于之前没有数据,因此回滚指针对应指向空地址。

 

图片

 

      每个事务都有自己的一个id,就像其身份证一样唯一标记该事务。当事务启动的时候,向Innodb存储引擎进行申请。假设此时如果打南边来了个事务A,它的事务id为12,事务A对表中的数据字段count进行修改,修改后该条数据对应的事务id为12,同时回滚指针指向实际的undo log回滚日志的地址。

图片

此时打北边又来了个事务B,它的事务id为20,事务B将表中的数据字段count修改为21,对应数据的事务id变为20,回滚指针指向上一条undo log信息。如下图所示:

图片

如果一直有事务进行数据的修改,那么就会形成一条由回滚指针串联的undo log多版本链条。

 

二、MVCC如何保证事务隔离

 

    阐述完了undo log多版本链条原理,我们知道当一个事务A(事务id=12)更新数据后,当前数据的事务id变为12,同时回滚指针指向undo log数据。每次进行数据更新后,事务id就是修改数据的事务id,同时回滚指针指向回滚数据,最终形成undo log链。但是仅仅依靠undo log多版本链好像并不能实现事务并发执行时的相互隔离,因此我们需要一种机制可以利用undo log多版本链来实现事务隔离。这个机制就是ReadView。

 

    Mysql执行事务的时候,会生成一个ReadView,其中会包含以下重要信息:

(1)m_ids:mysql中未提交的事务id集合;

(2)min_trx_id:集合中最小的事务id;

(3)max_trx_id,mysql下一个要生成的事务id,也就是事务id集合中最大的事务id加1;

(4)当前需要执行的事务id;

 

    下面我们来说说Mysql的RR(Repeatable Read )隔离级别即可重复读,读取数据的事务,无论读多少次都是和第一次读取数据获得的值时一样的。我们一起来看下可重复读是如何通过MVCC实现的。  假设现在有事务A以及事务B两个事务,A事务需要读取数据,B事务需要修改数据。

图片

 

当事务A需要读取数据时,开启ReadView。由于此时数据库活跃的事务为事务A以及事务B,那么对应的ReadView中m_ids={12,34},min_trx_id=12,max_trx_id=35,当前需要执行的事务id为12。此时事务A读取数据时,先判断当前的事务id为12,而数据中的事务id为11,小于当前事务A的id。说明当前读取的数据是在事务A开启之前提交的,因此可以正常进行数据读取。

 

图片

 

如果此时事务B进行了数据修改,修改count为29。而事务A再次进行数据读取时,继续进行判断,发现当前数据对应的事务id为34比当前的查询事务要大,但是小于max_trx_id,同时在m_ids中。说明该事务id对应的事务和事务A属于并发执行事务,因此不能进行数据读取。则根据undo log版本链,往上寻找undo log信息。如果找到的事务id小于当前读取数据的id则证明此时的数据是在当前开启查询事务之前提交的,因此可以进行数据的查询。

 

图片

 

    那么另外一个问题又来了,RC级别又是如何实现的呢?所谓RC级别,就是当别人的事务提交后,你就可以读取到别人修改后的值。因此会发生不可重复读问题。当设置为事务级别为RC时,它每次发起数据查询(set session transaction isolation level read committed;)后,每次进行数据查询都会新开启一个新的ReadView。

    假设当前事务中活跃着两个事务,他们的事务id分别是12、34。此时事务id为34的事务更新了数据。此时数据更新为29。同时数据对应的事务id更新为34,同时回滚指针指向上一条数据。若此时事务id为15的事务进行数据查询,此时开启readview,进行检查,发现此时的数据中对应的事务id在活跃事务id中,说明是和查询事务差不多时机执行的,但是此时的事务还未提交。因此此时的数据不可以读,所以顺着undolog版本链条读取上一次的数据。同时进行判断。

    如果事务B进行了提交,那么事务A再次进行数据查询的时候,会新开启一个ReadView,我们暂且称之为ReadViewA1,由于此时的事务B已经提交,所以ReadViewA1中对应的活跃列表中只有事务A对应的事务id为12。此时发现事务已提交,不再活跃事务列表中,因此可以进行数据读取。

图片

 

     综上分析,这就是Mysql通过ReadView以及undo log多版本链条实现RC以及RR的秘密。RC以及RR的区别就在于,RC事务隔离级别下,每次获取数据的时候,都会重新生成新的ReadView,再根据ReadView中的信心进行数据读取的判断。

 

三、总结

 

    综合以上的分析我们大致理清楚了Mysql多事务并发的隔离原理,其本质是通过MVCC机制来进行实现的。而MVCC其实是基于ReadView以及undo log多版本链条实现。Mysql的默认隔离级别是RR,避免了脏读、不可重复读以及幻读的问题。

YOLOv8 交通流量监测详解 本文介绍了一个基于YOLOv8的交通流量监测系统,该系统通过深度学习技术实现车辆实时检测、跟踪和分类。系统核心功能包括:1)使用YOLOv8模型检测道路车辆并进行持续跟踪;2)按方向和车型统计车流量;3)支持多区域流量监测和数据可视化。文章提供了完整的代码实现示例,涵盖基础车辆检测、视频流处理和高级数据分析功能。系统还可进一步优化性能,如使用轻量级模型、GPU加速等,并建议扩展车速估算、密度分析等功能。该方案为交通管理提供了有效的实时监测和决策支持工具。 阅读详情

相关推荐

BCIC IV 2a数据集:从下载到实战应用全解析

本文全面解析了BCI Competition IV 2a(BCIC IV 2a)数据集的应用流程。从官方渠道下载数据、解析其结构,到在MATLAB和Python环境中进行数据导入、预处理(包括处理特殊受试者A04T),并详细演示了从特征提取(如CSP)到分类(如LDA、SVM)的完整实战步骤,为脑机接口研究者提供了从入门到实践的清晰指南。

weixin_28235513的博客 975

MySql MVCC 详解

MVCC 是多版本并发控制(Multiversion Concurrency Control)的缩写。它是一种数据库事务管理技术,用于解决并发访问数据库的问题。MVCC 通过创建多个版本的同一数据,每个版本与一个事务关联,来实现并发控制。数据库在执行更新操作时,会保留之前版本的数据,以便其他正在执行事务的用户可以访问这些数据。每个事务都能看到一个稳定的数据快照,并且仅接触到他们自己的版本,这意味着每个事务可以独立地读取和写入数据,而不会干扰其它事务。

MrLee的博客 7677

COMSOL仿真教程—激光烧蚀

本例使用二维模型,将来自激光的入射热通量模拟为金属表面上空间分布的热源,从而得到金属的烧蚀过程和瞬态温度分布。

qq_40977332的博客 2万+

MySQL的MVCC详细理解(2022版)

MySQL的MVCC详细理解(2022版) 1、什么是MVCC 2、为什么需要MVCC 3、原理 流程

我是老伯的博客 1万+

Raid5损坏两块盘

  以下为浪潮Inspur NF5460M4型号服务器故障处理过程: 设备raid5组损坏两块硬,并raid组处理离线状态,情况如图:     由于硬盘数据比较重要,面对此情况不要慌我们尽量做到安全保守的保证数据尽可能完整,以下为处理方法,(遇raid5两块盘出现问题处理方法)   以下截图均为遇相同问题的解决图案,并非现场截图。 Ctrl+H 进WebBios界面,发现两...

chen_lipeng的博客 2万+

QT实现串口通信

要实现串口通信,需要知道串口通信需要的信息 主要参数有:波特率、校验位、数据位、停止位、控制流 主要操作有:串口的打开和关闭、刷新设备串口、接发数据、开关显示灯等。 实现效果如图: 最后附赠完整源码。 第一步:在头文件中引入 QtSerialPort 类的两个头文件(必须引入) // 引入串口通信的两个头文件(第一步) #include <QtSerialPort/QSerialPort> // 提供访问串口的功能 #include <QtSerialPo

m0_49456900的博客 6万+

mysql的mvcc详解

1。即通过数据行的多个版本管理来实现数据库的并发控制,使得在InnoDB事务隔离级别下执行一致性读操作有了保障。2.mysql中的InnoDB中实现了,大大提高数据库的并发度。3..MySQl中只有InnoDB支持MVCC,其他存储引擎不支持4.为了查询一些正在被其他事务更新的值的时候,能够查到它们被更新之前的值,这样做就能在查询的时候不必等待更新事务的提交。

健康平安的活着的专栏 7850

保姆级教程:用QSTEM和DrProbe搞定你的第一张STEM模拟图(附Fe3O4实例文件)

本文提供了一份详细的STEM模拟图像生成教程,涵盖从晶体结构获取到最终图像模拟的全过程。通过QSTEM和DrProbe软件的操作指南,帮助材料科学研究者快速掌握STEM模拟技术,特别适合初学者。教程包含Fe3O4实例文件,详细解析参数设置、计算优化和结果分析等关键步骤。

weixin_33730836的博客 523

【MySQL】MVCC详解, 图文并茂简单易懂

ReadView就是事务在使用MVCC机制进行快照读操作时产生的读视图当事务读取数据时, 会数据库系统生成当前的一个快照,InnoDb会为事务构造一个数组, 用于记录并维护系统中当前的活跃事务ID组(活跃是指: 开启了但是还没有进行提交).本文介绍了MVCC在这两种隔离级别下事务在执行快照读操作时访问记录的版本链的过程。这样使不同事务的读-写操作并发执行,从而提升系统性能。核心点在于 ReadView 的原理,在每一次进行普通SELECT操作前都会生成一个ReadView。

m0_70094411的博客 1838

深入解析set_input_delay:从理论到实践的关键时序约束

本文深入解析了FPGA/ASIC设计中关键的时序约束命令set_input_delay,从理论到实践详细阐述了其工作原理。文章重点讲解了如何结合setup time和hold time,通过计算-max与-min值来精确描述外部延迟,确保芯片内部逻辑能稳定捕获数据,并介绍了虚拟时钟、DDR接口约束等实战技巧与常见陷阱。

weixin_29313423的博客 317

【光子 AI 】LangGraph:Graph = 有向有环图 + 状态机实现原理详解:数据结构模型与核心算法代码实现逻辑解析

LangGraph核心原理解析:基于Pregel模型的消息传递图,结合有向有环图和状态机特性。关键实现包括:1) 共享状态机制(TypedDict/Pydantic模型)配合Reducer逻辑实现状态更新;2) 图拓扑结构通过邻接表维护节点和条件边;3) 检查点机制支持状态持久化和恢复。运行时采用Pregel循环算法,通过超级步迭代执行节点函数、应用状态归约、条件路由下一批节点,同时支持人工中断和异步并行处理。该架构使LangGraph具备循环执行、条件跳转等DAG无法实现的动态流程控制能力。

AI天才研究院 1036

MySql的MVCC详解

MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。mvcc - @百度百科。

hncujing的专栏 608

超导电动悬浮系统一体化地面线圈电-热-力特性研究——基于ANSYS Maxwell与Workbench的多物理场联合仿真

摘要:超导电动悬浮(EDS)系统的地面线圈在运行中面临电-热-力多物理场强耦合挑战。本文基于ANSYS Maxwell和Workbench平台,提出一套联合仿真方法,对地面线圈进行高保真多物理场耦合分析。研究通过建立参数化三维电磁模型,计算瞬态涡流损耗和电磁力分布,并顺序耦合至热分析和结构分析,揭示电-热-力特性的相互影响机制。该方法为地面线圈的优化设计、材料选型和可靠性评估提供了理论依据和仿真工具支撑。 关键词:超导电动悬浮;地面线圈;多物理场耦合;联合仿真;ANSYS

huanghm88的专栏 376

通俗易懂的MySQL事务及MVCC原理,我先收藏了!

一、事务简介与四大特性 事务指的是一组命令操作,在执行的过程中,要么全部成功,要么全部失败。 由引擎层支持事务,MyISAM就不支持事务,而InnoDB是支持事务的。 事务具有以下四大特性(ACID): 原子性(Atomicity):指事务不可分割,要么全部成功,要么全部失败,不可能存在部分成功或部分失败的情况。如果执行某一条语句失败后,将会触发之前所有执行过的语句的回滚,因此靠的是undo log。 一致性(Consistency):在事务执行前后,数据的完整性没有遭到破坏。一致性是mysql追

阳阳的博客 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

多版本并发控制

MVCC (Multiversion Concurrency Control),多版本并发控制。顾名思义,MVCC 是通过数据行的多个版本管理来实现数据库的。这项技术使得在InnoDB的事务隔离级别下执行操作有了保证。换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。MVCC没有正式的标准,在不同的DBMS中MVCC的实现方式可能是不同的,也不是普遍使用的(大家可以参考相关的DBMS文档)。这里讲解InnoDB 中MVCC的实现机

weixin_48777366的博客 542

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

一篇文章彻底搞懂MySql之MVCC机制

讲解了什么是MVCC、undo日志版本链、read-view一致性视图、undo版本链比对机制、模拟MVCC的执行流程

大尾巴狼学编程的博客 3766

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

MySQL的MVCC及实现原理

一、前提概要 1. 什么是MVCC? MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。 MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读 什么是当前读和快照读? 在学习MVCC多版本并发控制之前,我们必须先了解一下,...

给自己一个smile 3215

详解MySQL的MVCC(ReadView部分解析C++源码)

一种数据库中用于处理并发读写事务的技术。它通过维护数据的不同版本来实现对同一数据项的并发访问,并且在保证事务隔离性的同时,允许读操作无需加锁就能获取一致性的数据视图。

qq_62835094的博客 4119

MySQL之MVCC

事务隔离级别 对于一个MySQL服务,可以有多个客户端与其建立连接,并向其发送SQL语句,一条SQL语句可能是一个事务的一部分,MySQL可以同时处理客户端的多个事务。 一次事务对应着一次完成的状态转换,事务执行完毕后,需要保证数据符合客观逻辑上的一致性,数据库自身提供了一些约束保证一致性,例如主键、唯一索引、外键、不允许为NULL值等帮助用户解决部分数据上的一致性要求, 例如唯一索引是不可以重复的,判断是否重复由数据库管理,如果重复则业务抛出错误,并回滚事务,避免出现相同的值导致错乱, 但是数据库

cainiao1412的博客 1104

【进阶篇】MySQL的MVCC实现机制详解

在本篇博客中,我们深入探讨MySQL的MVCC实现机制,包括Undo日志、Read View以及事务链等概念。我们将详解MVCC如何在保证数据一致性的同时,提高数据库的并发处理能力。本篇博客旨在帮助读者理解和掌握MySQL中MVCC的工作原理,以更好地进行数据库设计和优化。

日拱一卒无有尽,功不唐捐终入海 1635

MySQL 中的 MVCC 是什么?

MVCC 是 MySQL InnoDB 存储引擎的核心特性之一,它通过数据版本化和一致性视图机制,在保证事务隔离性的同时,实现了高并发的读写操作。尽管 MVCC 存在一些局限性(如版本链开销和长事务问题),但在大多数场景下,它仍然是提升数据库并发性能的关键技术。是一种用于实现高并发读写操作的机制,它通过维护数据的多个版本来解决读写冲突,从而在保证事务隔离性的同时,减少锁的使用,提升数据库的并发性能。

篱笆院的狗的博客 1523

【Mysql】MySQL的MVCC及实现原理,核心目标与全流程图解

MySQL的MVCC及实现原理,核心目标与全流程图解,基于MySQL 8.0源码与InnoDB引擎实现,通过核心流程图+代码解析说明MVCC原理:解决两大问题:读写冲突:读操作不阻塞写操作 事务隔离:实现RC(读已提交)、RR(可重复读)隔离级别

夜雨的博客 1317

详解MySQL中 MVCC

多版本并发控制(MVCC,Multiversion Concurrency Control)是一种数据库并发控制方法,它通过保留数据的多个版本来管理事务并发。与传统的锁机制不同,MVCC 允许多个事务同时读取和写入数据,而不会相互干扰,从而提高数据库的并发性和性能。在 MVCC 中,每当数据发生变化时,数据库会创建一个新的版本,而不是直接修改原始数据。这意味着多个事务可以同时读取数据,而不必等待其他事务的完成,从而实现高并发读写。

error_log7的博客 4788

mysql的MVCC机制详解

1. 什么是MVCC机制? 首先来认识一下可重复读: 可重复读:mysql的默认隔离级别是可重复读,也就是在一个事务中,多次查询结果都相同。就算有其他事务修改了数据,也不会影响当前事务的查询结果。 mysql是怎么来实现可重复读的呢? 其实是靠MVCC(Multi-Version Concurrency Control-多版本并发控制)机制来实现的。首先mvcc机制不会对读操作加锁,不会通过加锁控制来保证读写隔离(串行化隔离级别是这样干的!),避免了频繁加锁,保证了读操作的效率。 注意:mysql在读已提交

qq_1149513559的博客 2749
上一篇: 程序员:如何写出斗帝级简历?
下一篇: 你真的了解执行上下文吗?
Java斗帝之路
博客等级 码龄7年 2392粉丝 687原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值