深入理解mysql的MVCC机制及实例详解

深入理解MySQL数据库的MVCC机制 数据库在处理并发事务时,为了维护数据的一致性和隔离性,采用了多种机制。在这些机制中,多版本并发控制(MVCC,Multi-Version Concurrency Control)是一种非常高效的并发控制方法。MySQL数据库的InnoDB存储引擎支持MVCC,这使得它在处理高并发事务时性能表现出色。在本文中,我们将详细探讨MySQL中的MVCC原理,并通过实例来加深理解。 阅读详情

一、MVCC多版本并发控制机制

  • mysql在读已提交和可重复读的隔离级别下,通过MVCC机制实现的。

二、undo日志版本链

  • undo日志版本链是指一行数据被多个事务依次修改过后,在每个事务修改完后,Mysql会保留修改前的数据undo回滚日志,并且用两个隐藏字段trx_id和roll_pointer把这些undo日志串联起来形成一个历史记录版本链

三、read view机制详解

  • 当事务开启,执行任何查询sql时会生成当前事务的一致性视图read-view,该视图在事务结束
    之前都不会变化(如果是读已提交隔离级别在每次执行查询sql时都会重新生成),这个视图由执行查询时所有未提交事务id数组(数组里最小的id为min_id)和已创建的最大事务id(max_id)组成,事务里的任何sql查询结果需要从对应版本链里的最新数据开始逐条跟read-view做比对从而得到最终的快照结果。

四、实例

假如数据表test中有一条id为1的数据,name值为1,是由事务1插入完成的。然后开启如下事务:
开启事务如下100、200、300,依次按照从上往下的时间执行:

时间# Transaction 100# Transaction 200# Transaction 300# select 1
1begin;begin;begin;begin;
2update test set name = ‘2_100’ where id =3;
3update test set name = ‘3_200’ where id =2;
4update test set name = ‘4_300’ where id = 1;
5commit;
6select name from test where id = 1;
7update test set name = ‘9_100’ where id = 1;
8select name from test where id = 1;
9commit;
10update test set name = ‘12_300’ where id = 1;
11select name from test where id = 1;
12commit;

每一条数据都有一个undo日志版本链,这里只研究id为1的:

  1. 时间1时,都开启事务
  2. 时间2:Transaction 100事务,将id为3的记录name值修改为2_100
  3. 时间3:Transaction 200事务,将id为2的记录修改为3_200
  4. 时间4:Transaction 300事务,将id为1的记录修改为4_300,原本表中的值为1。(id,name,trx_id,roll_pointer)其中id代表记录ID,name就是这次修改的字段,trx_id则是事务id,roll_pointer指向下一个修改记录。则当前生成的undo日志版本链,可大致表示为:(1,1,1,)–>(1,4_300,300,)
  5. 时间5:提交Transaction 300事务。
  6. 时间6:# select 1对id为1的记录进行查询。根据上面read-view生成规则(所有未提交事务id数组和已创建的最大事务id组成)。此时未提交的事务为Transaction 100、Transaction 200,组成的数组可记为[100,200],已创建的最大事务id为300.则当前read-view为[100,200],300
  7. 时间7:Transaction 100事务,将id为1的记录name值修改为9_100,则undo日志版本链变为(1,1,1,)–> (1,4_300,300,) -->(1,9_100,100,)
  8. 时间8:# select 1对id为1的记录进行查询。则当前的read-view为[100,200],300
  9. 时间9:提交Transaction 100事务。
  10. 时间10: Transaction 200事务,将id为1的记录name值修改为12_300,则undo日志版本链变为(1,1,1,)–> (1,4_300,300,) -->(1,9_100,100,)–>(1,12_300,200,)
  11. 时间11:# select 1对id为1的记录进行查询。则当前的read-view为[200],300
  12. 时间12:提交Transaction 200事务。

版本链比对规则:

  1. 如果 row 的 trx_id 落在( trx_id<min_id )部分,表示这个版本是已提交的事务生成的,这个数据是可见的;
  2. 如果 row 的 trx_id 落在( trx_id>max_id )部分,表示这个版本是由将来启动的事务生成的,是不可见的(若row 的 trx_id 就是当前自己的事务是可见的);
  3. 如果 row 的 trx_id 落在部分(min_id <=trx_id<= max_id),那就包括两种情况
    a. 若 row 的 trx_id 在视图数组中,表示这个版本是由还没提交的事务生成的,不可见(若 row 的 trx_id 就是当前自己的事务是可见的);
    b. 若 row 的 trx_id 不在视图数组中,表示这个版本是已经提交了的事务生成的,可见。

1.当开启读已提交隔离级别

  • 时间6:read-view为[100,200],300,其undo日志链为(1,1,1,)–>(1,4_300,300,);当前undo日志记录的事务id为300,满足上面版本链对比规则第三条中的b,则代表可见。所以此刻查询出来的值为4_300
  • 时间8:read-view为[100,200],300,其undo日志链为(1,1,1,)–> (1,4_300,300,) -->(1,9_100,100,);当前的事务id为100,满足上面版本链对比规则第三条中的a,则代表不可见。此时就要回退一个版本链到 (1,4_300,300,),上步已做分析可见。所以此刻查询出来的值为4_300
  • 时间11:read-view为[200],300,其undo日志链为(1,1,1,)–> (1,4_300,300,) -->(1,9_100,100,)–>(1,12_300,200,),满足上面版本链对比规则第三条中的a,则代表不可见。此时就要回退一个版本链到 (1,9_100,100,),满足上面版本对比规则第一条,代表可见。则读取的数据为9_100

2.当开启可重复读隔离级别

开启可重复读,与读已提交的对比规则一致。但是,在可重复读的隔离级别下,执行第一条查询语句生成read-view后,后面不再改变。
如上面实例:

  • 在时间6:生成read-view为[100,200],300后,时间8和时间11的read-view仍然为[100,200],300。
  • 剩下的比对规则跟上面一致。如此也就保证可重复读。
【MySQL】深入理解MVCC与BufferPoll缓存机制 MVCC就是多版本并发控制机制MySQL在隔离级别下如何保证事务较高的隔离性?同样的SQL查询语句,就算对数据有也当前事务SQL语句的查询结果。在和这两个隔离级别下,它们的隔离性都是通过MVCC机制来实现的!而也可以保证,但是是通过加锁互斥来实现的!有时候连select,也要加上读锁!性能是相当的低!我们最常用的还是这个隔离级别!MVCC机制的实现就是通过read-view机制与undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取同一条数据在版本链上的不同版本数据。 阅读详情

相关推荐

从Palantir到AI时代:Forward Deployed Engineer模式的深度解析

《从Palantir到AI时代:FDE模式的创新与挑战》摘要:Palantir开创的前置部署工程师(FDE)模式正在成为AI创业公司的标配。该模式通过现场工程师深入了解客户需求,填补产品与实际应用间的鸿沟,颠覆了传统SaaS规模化路径。核心优势在于将定制化服务转化为产品发现机制,特别适合高度异质化的AI市场。成功关键在于平衡定制与标准化,通过合同价值增长、产品杠杆效应等独特指标衡量成效。FDE人才需要兼具领域洞察力与快速原型能力。这一模式表明,在AI等新兴领域,深入客户现场可能比单纯追求技术突破更能创造商业

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 4534

图解 MySQL MVCC 实现原理

用图解的方式解释了 MySQL MVCC 机制实现的原理

Bryant5051的博客 1256

英语语法-句法

摘要:本文系统梳理了英语句法知识,重点解析了五种基本句型及其扩展结构。内容包括句子类型(陈述句、疑问句、祈使句、感叹句)、复合句构成(从句分类与连词使用)、特殊句型(倒装、强调、引语转换)等。特别强调句子成分分析技巧,指出每种句子成分可由不同词法单元充当,需掌握成分识别与划分方法。文章还提供了往期语法系列链接,形成完整的英语语法学习体系,帮助读者建立从词法到句法的系统认知框架。

STCNXPARM的博客 8803

mysql的mvcc详解

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

健康平安的活着的专栏 7850

鸿蒙实战开发教程-注册登录页面

在密码输入框中,只要设置TextInput的类型就可以实现带眼睛logo的密码输入框效果:

2401_82546228的博客 3559

VFIO框架源码分析(二十二)- IOMMUFD 的脏页跟踪与 Dirty Bits 读取

在虚拟化热迁移(Live Migration)的场景中,脏页追踪(Dirty Page Tracking)是最具挑战性的环节之一。它的核心任务是实时捕获设备(DMA)对内存的写操作,以便 VMM(如 QEMU)知道哪些内存页需要被重新传输到目标主机。在强耦合与粗粒度:脏页追踪是绑定在 Container 上的。这意味着,如果一个 Container 内有多个设备,哪怕只有一个设备在写内存,脏页追踪也会影响 Container 内的所有设备。软件模拟开销大。

qq_36071928的博客 1043

MySQL的MVCC详细理解(2022版)

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

我是老伯的博客 1万+

Social-Auto-Upload实战:如何用Python+Playwright实现抖音/B站/小红书一键三连发?

本文详细介绍了如何使用Python和Playwright框架构建Social-Auto-Upload自动化上传工具,实现抖音、B站、小红书等平台的一键多发布。通过模拟真实用户操作和Cookie管理技术,该工具能有效解决内容创作者跨平台发布的重复劳动问题,提升工作效率。

day7的博客 1401

MySql MVCC 详解

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

MrLee的博客 7676

物联网与人工智能项目实战:构建智能农业监控系统

智能农业监控系统通过物联网技术实时监测农业环境中的各项数据(如土壤湿度、温度、光照强度等),并利用人工智能技术分析和预测农业生产的趋势,进而为农民提供决策支持。系统的核心目标是提高农作物的产量和品质,同时减少资源浪费,优化农田管理。环境监测:实时采集农田的温湿度、土壤湿度、光照等环境数据。作物生长监测:通过传感器和图像识别技术监测作物的生长状况。智能灌溉系统:根据土壤湿度和气候条件自动调整灌溉量。病虫害检测与预警:利用人工智能和图像识别技术自动检测作物病虫害,并及时给出预警。数据分析与决策支持。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 709

Vue2 - 最新详细实现接入天地图详细配置流程及示例代码教程,提供获取用户当前定位的城市名称及省市区数据、精准经纬度信息、IP属地定位、地图搜索标点等示例,解决天地图跨域报错/页面白屏/定位不准问题

vue2,nuxt2,天地图,使用教程,vue接入国家天地图,定位api,ip属地定位,获取用户当前位置数据,省市区,地图不显示,白屏,报错,vue2如何使用天地图,地图选点,cors跨域,白名单设置了还是不行,vue项目调用天地图api实现定位,Vue2中使用天地图,详细教程,天地图申请密钥key教程,经纬度,经纬度不准确,一直定位北京,定位在北京不准怎么办,nuxt项目天地图,网站,网页,h5页面,地图显示不全,获取当前定位,如何使用天地图,拿到客户ip地址定位城市名称,距离计算,实时搜索地址逆解析,天

🏆 前端领域优质创作者 5325

详解MySQL中 MVCC

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

error_log7的博客 4788

Windows 下 Hermes Agent(爱马仕)安装全记录:从零到一的保姆级图文教程

本文主要介绍了Windows 下 Hermes Agent(爱马仕) 安装全记录:从零到一的保姆级图文教程,希望能对学习使用 Hermes Agent 的同学们有所帮助。 文章目录 1. 背景 2. 实战教程 2.1 步骤一 安装WSL环境 2.2 步骤二 安装Python环境 2.3 步骤三 安装Hermes Agent 2.4 步骤四 修正 API Key 错误 2.5 步骤五 配置多个模型 2.6 步骤六 启动Hermes Agent 3. 常见问题及解决方案 4. 总结

weixin_43178406的博客 14万+

【MySQL进阶-05】深入理解mvcc机制(详解)

深入理解mvcc机制

zhenghuishengq的博客 2万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

深入理解 MySQL 中的锁和MVCC机制

MySQL中的锁和MVCC是确保数据完整性和并发性的关键机制。深入理解它们的工作原理和使用方法,有助于设计和维护高性能的数据库系统。选择合适的隔离级别、避免过度使用锁、监控和调优是确保数据库系统安全可靠的关键步骤。通过不断学习和实践,我们可以更好地掌握MySQL中的锁和MVCC,提高数据库系统的性能和可靠性。😊🙏Java面试技巧Java面试八股文 - 掌握面试必备知识(目录篇)Java学习路线2023年完整版Java学习路线图AIGC人工智能。

学IT,找陈寒 9612

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

深入理解MySQL中的MVCC机制

MVCC是MySQL实现高并发事务处理的核心技术之一。通过保存数据的多个版本,MVCC允许多个事务同时读取同一数据,而不会相互阻塞。Read View和Undo Log版本链是MVCC机制中的关键组件,它们决定了事务在读取数据时能看到哪些版本的数据。理解MVCC的工作原理和实现细节,可以帮助我们更好地设计和优化数据库应用,提高系统的并发性能和稳定性。

秃头之旅 1229

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

实战MYDB的mvcc与mysql的mvcc详解

最近做的一个简易版的MySQL-MYDB。里面也实现了mvcc。趁这个机会结合项目深入理解一下mvcc的机制。先来看MySQL的mvcc讲了啥?

qq_64948664的博客 1277

深入理解MySQL中的MVCC:从概念到底层实现

MySQL的MVCC机制通过多版本并发控制实现高效读写隔离,核心依赖隐藏列(DB_TRX_ID、DB_ROLL_PTR)、undo日志版本链和Read View可见性判断。MVCC支持事务隔离级别,解决脏读、不可重复读问题,实现读写不冲突,显著提升并发性能。不同隔离级别下行为不同:RC每次查询生成新Read View,RR首次查询固定Read View。理解MVCC有助于优化SQL和事务设计,是高并发场景性能调优的关键基础。

2301_80017072的博客 1942

从ReadView深入理解MySql MVCC原理

MySql MVCC 机制 在说MVCC机制前我们先了解ReadView。 ReadView是什么呢?在我们平时执行一个事务的时候,就会生成一个ReadView,ReadView的组成结构大致如下 参数说明: creator_trx_id:当前事务id m_ids:所有事务的事务id min_trx_id:m_ids里最小的事务id值 max_trx_id:最大事务id 我们来具体分析一下ReadView的作用,以及是如何解决脏读幻读,不可重复读的问题的 现在数据有一条数据,如下原始值,上一个已经提交

念念不忘,必有回响 9928

深入理解PostgreSQL的MVCC机制

PostgreSQL的MVCC机制是其高性能并发访问的核心技术,通过维护数据多版本实现读写并发执行。本文深入解析了MVCC的实现原理,包括事务ID(XID)、元组隐藏字段(xmin/xmax)和可见性规则等核心机制。相比传统锁机制,MVCC显著提高了并发性,减少了锁竞争。PostgreSQL采用主表存储多版本的方式,通过VACUUM机制清理死元组,其中AutoVACUUM可自动监控和回收空间。文章还详细介绍了INSERT/UPDATE/DELETE操作在MVCC下的处理逻辑,以及标准VACUUM与VACUU

ypl0ipy的博客 1556

MySQL深入理解MVCC机制(详解)

深入理解mvcc机制

m0_60500421的博客 1301

MySQL--深入理解MVCC机制原理

Read View 是事务执行快照读产生的视图,在事务执行快照读的时候,系统会以当前时刻生成一个快照,以此来维护系统此时活跃的事务id,用来做可见性判断,当某个事务进行快照读的时候,我们根据 Read View 来判断当前事务可以读取哪个版本的数据,然后就去该数据的 undo log 里面找数据,当然也可能是读取最新的数据。MVCC 解决的是读写并发问题,而更新丢失是写写并发问题,MVCC不能解决更新丢失问题,更新丢失依赖数据库的隔离级别来解决。如有不正确的地方请各位指出纠正。注意事务ID 是递增的。

weixin_42118323的博客 1958

MySQL6-深入理解MVCC和BufferPool缓存机制

MVCC机制的实现就是通过read-view机制与undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取同一条数据在版本链上的不同版本数据。面试的时候可以这么讲:MVCC机制就是通过undo版本链和read-view机制来实现的,它会在每个事务执行查询SQL的时候生成一个readView,然后通过它跟版本链对比来实现隔离性的。undo版本链就是把每个操作都记录下来,然后分配一个事务id和指针,指向之前数据的地址。read-view就是根据未提交事务的事务id数组和已提交事务的最大id生成的。

程序员句号的博客 798

【MySQL进阶-05】深入理解mvcc机制(详解)(2),阿里巴巴二面被血虐

MVCC:Multi-Version Concurrency Control,多版本并发控制机制。在mysql中,为了满足事务的四大特性之一的隔离性,就是当前事务中的查询的数据不受其他事务的增删改操作的影响,因此mysql主要是通过这个可串行化的这种隔离级别和现在即将要谈的mvcc机制来实现。而可串行化就是将所有的操作由并行改为串行,就是在每个增删改包括查操作上面都加了锁,因此性能非常的低,因此mysql也并没有选择这个可串行化来作为mysql的默认的隔离级别,而是使用的可重复读。

2401_84264915的博客 831
上一篇: mysql索引简介及索引底层数据结构为何采用B+Tree
下一篇: Spring IOC基于XML配置使用
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值