mysql数据库的mvcc机制详解

MySQL事务隔离机制底层原理:MVCC版本链与锁机制全解析 在数据库并发访问场景中,事务隔离是保证数据一致性的核心机制。很多开发者对脏读、不可重复读、幻读的概念耳熟能详,却对底层的实现原理知之甚少。MySQL InnoDB引擎通过多版本并发控制(MVCC)与锁机制协同工作,实现了不同隔离级别下的数据可见性控制。MVCC利用隐藏列和undo log构建版本链,配合ReadView一致性视图,让快照读能够无锁读取历史版本;而当前读则依赖记录锁、间隙锁与临键锁,在可重复读级别下有效抑制幻读。理解这些原理,不仅有助于解答面试中的高频问题,更能指导业务系统正确设置隔离级别、优 阅读详情

MySQL 的 MVCC(Multi-Version Concurrency Control,多版本并发控制)是实现高性能、高并发事务的核心机制,尤其在可重复读(REPEATABLE READ)隔离级别下发挥重要作用。以下是 MVCC 的详细解析:

1. MVCC 的核心概念

(1)多版本共存

MVCC 为数据库中的每行记录保存多个历史版本,每个事务读取时会看到特定版本的数据,而非最新数据。这使得读操作无需加锁,提高了并发性能。

(2)隐藏字段

InnoDB 为每行记录添加三个隐藏字段:

  • DB_TRX_ID:记录最后一次修改该行的事务 ID。
  • DB_ROLL_PTR:指向回滚段(Rollback Segment)中的undo日志,用于生成旧版本数据。
  • DB_ROW_ID:行ID,若表无主键或唯一非空索引时自动生成。
(3)事务ID

每次启动事务时,InnoDB 分配一个唯一递增的事务 ID(trx_id),用于标识事务的先后顺序。

2. MVCC 的工作原理

(1)版本链与 Undo 日志
  • 版本链:每行记录的多个版本通过 DB_ROLL_PTR 连接成链表,最新版本指向最早版本。
  • Undo 日志:记录每行记录的历史版本,用于回滚和生成一致性视图。
(2)一致性视图(Read View)

每个事务启动时,InnoDB 会创建一个一致性视图,包含以下内容:

  • trx_ids:当前活跃事务的 ID 列表(未提交的事务)。
  • low_limit_id:当前最大事务 ID + 1(未来可能分配的最小 ID)。
  • up_limit_id:trx_ids 中的最小事务 ID。
(3)可见性规则

当事务读取某行记录时,MVCC 根据以下规则判断版本是否可见:

  1. 若记录的 DB_TRX_ID < up_limit_id:事务启动前已提交,可见。
  2. 若 DB_TRX_ID ≥ low_limit_id:事务启动后生成,不可见。
  3. 若 up_limit_id ≤ DB_TRX_ID < low_limit_id:
    • 若 DB_TRX_ID 在 trx_ids 中:事务未提交,不可见。
    • 否则:事务已提交,可见。

3. MVCC 在不同隔离级别下的行为

(1)读已提交(READ COMMITTED)
  • 一致性视图:每个 SELECT 语句执行时重新生成。
  • 效果:只能读取已提交的数据,可能读到其他事务的更新(不可重复读)。
(2)可重复读(REPEATABLE READ)
  • 一致性视图:事务启动时生成一次,整个事务期间复用。
  • 效果:同一事务中多次读取相同记录结果一致,避免不可重复读和普通查询的幻读。
(3)串行化(SERIALIZABLE)
  • MVCC 失效:所有 SELECT 变为当前读(加共享锁),强制事务串行执行。

4. MVCC 与当前读的区别

操作类型读取方式是否加锁可见性规则
普通 SELECT快照读(MVCC)否遵循一致性视图规则
SELECT ... FOR UPDATE当前读(最新数据)是(行锁/间隙锁)读取最新版本,无视视图规则
INSERT/UPDATE/DELETE当前读(最新数据)是(行锁/间隙锁)读取最新版本并加锁

5. MVCC 如何避免幻读?

在可重复读隔离级别下:

  • 普通查询(MVCC):
    事务始终使用启动时的一致性视图,即使其他事务插入新记录,当前事务也看不到(因为新记录的 DB_TRX_ID 大于视图的 low_limit_id)。

  • 当前读(如 SELECT ... FOR UPDATE):
    通过间隙锁(Gap Lock)锁定记录之间的间隙,阻止其他事务插入新记录,从而避免幻读。

6. MVCC 的局限性与优化

(1)局限性
  • 长事务:长时间运行的事务会保留大量 Undo 日志,占用存储空间。
  • 锁竞争:当前读操作仍需加锁,可能导致死锁或性能下降。
(2)优化建议
  • 避免长事务:缩短事务执行时间,减少 MVCC 维护的版本数量。
  • 合理使用索引:确保当前读操作通过索引加锁,减小锁粒度。
  • 监控 Undo 日志:定期清理无用的 Undo 日志(通过 innodb_purge_threads 参数控制)。

7. 总结

MVCC 通过多版本共存和一致性视图,在不加锁的情况下实现了事务的隔离性,显著提高了并发性能。其核心优势在于:

  • 读-写不冲突:读操作无需等待写锁,反之亦然。
  • 事务隔离:在可重复读级别下,避免不可重复读和普通查询的幻读。

但 MVCC 仅适用于普通查询(快照读),对于当前读(如 INSERT、UPDATE)仍需依赖锁机制来保证数据一致性。

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

相关推荐

【ADCU详解】PMIC电源管理集成电路详解

自动驾驶域控制器(ADCU)中的电源管理集成电路(PMIC)是高度集成的关键部件,负责为计算核心、传感器等提供高效稳定的多路电源。其核心特点包括:符合车规AEC-Q100标准、支持功能安全ASIL等级、精确的时序控制及强抗干扰能力。PMIC由开关稳压器、LDO、时序控制器、监控保护电路等模块组成,通过分层电源树框架实现电能分配。设计需考虑效率、功率密度、噪声性能等关键维度,底层基于Buck转换器和LDO原理工作。使用中需满足严苛的车规环境要求,并通过静态/动态测试及故障注入测试进行验证,确保系统可靠性和安全

qq_40844444的博客 842

mvcc多版本并发控制

文章目录一、前提概要什么是MVCC?什么是当前读和快照读?当前读,快照读和MVCC的关系MVCC能解决什么问题,好处是?数据库并发场景有三种,分别为:MVCC带来的好处是?小结一下咯二、MVCC的实现原理隐式字段undo日志 一、前提概要 什么是MVCC? MVCC MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。 MVCC在MySQL InnoDB

suchahaerkang的博客 1237

STM32+EC800M-CN 4G模块数据透传踩坑实录:从AT指令调试到花生壳内网穿透

本文详细介绍了STM32与移远EC800M-CN 4G模块的数据透传实现过程,包括硬件连接、AT指令调试、TCP连接建立以及花生壳内网穿透配置。通过实战案例和代码示例,帮助开发者快速解决4G通信模块在物联网应用中的常见问题,提升数据传输稳定性。

weixin_42715608的博客 322

MySql MVCC 详解

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

MrLee的博客 7677

Dify实战:智能邮件工作流配置全解析

本文详细解析了如何利用Dify平台配置智能邮件工作流,实现邮件处理的自动化与智能化。内容涵盖从获取邮箱授权、安装插件、安全配置环境变量,到构建邮件发送工作流、创建调用该工作流的智能体(Agent)的完整步骤,并分享了连接知识库实现智能客服、定时发送日报等进阶自动化场景,旨在帮助用户显著提升邮件处理效率。

t8u9v0w1x的博客 795

Unity3d实现的十字路口的模拟(一)

最近学习了Unity3d这个游戏引擎,感觉真的是非常的强大,正好赶上操作系统课程要做一个模拟信号量的模拟程序,于是打算做一个模拟十字路口的程序,大致的实现要实现的成果是:存在四种不同的汽车,包括一辆警车(不受交通信号灯的控制)随机产生在不同的路口,并且有不同的行动路线如:直走,左转,右转等,当然还有交通信号灯来控制车辆的有序运行。可以展示不同的视角来观察路口的情况(利用Q,W,E,R分别控制不同的

永远在身边的专栏 7489

【数据库】数据库原理

1、事务 概念:事务是满足ACID特性的一组操作 原子性(Atomic):一组操作要么都执行,要么都不执行 执行失败的事务,通过回滚将已执行的操作进行撤销。回滚通过回滚日志(Undo Log)来实现,它记录着事务执行所作的操作,反向执行就可以恢复事务前的状态 一致性(Consistency):数据库在事务执行前或后都保持一致性状态 就是说在事务执行之前或执行之后,所有其他事务对同一个数据的读取结果是相同的,不存在你读是一个值,另一个操作读又是另一个值的情况 隔离性(Isolation):一个事务所作的修改

kazuhura的博客 1480

VSCode里玩转AvaloniaUI:手把手教你搭建跨平台桌面应用开发环境(附.NET 7配置避坑)

本文详细介绍了如何在VSCode中搭建AvaloniaUI跨平台桌面应用开发环境,包括.NET 7配置避坑指南。从环境准备、项目创建到调试优化,手把手教你利用VSCode和Avalonia实现高效开发,特别解决了.NET 7依赖等常见问题,助力开发者快速上手跨平台应用开发。

weixin_28826545的博客 577

MySql

MySQL

weixin_47556194的博客 440

OpenClaw进阶实战(二十五):抖音企业号——私信回复与视频评论分析

摘要:本文介绍抖音企业号自动化运营方案,突破抖音强风控体系的技术挑战。针对内容生产、私信互动和账号矩阵三大场景,提出混合架构解决方案: 私信自动化:结合关键词触发与随机延迟(45秒±15),实现拟人化回复,支持价格咨询/商务合作等高优先级消息识别 混合技术栈:官方API(合规)+真机RPA(覆盖长尾需求)+AI辅助生成(脚本→剪辑→发布闭环) 安全策略:通过设备指纹模拟、行为间隔随机化和内容差异化处理规避风控,提供每日200条的安全操作阈值。配套OpenClaw技能实现一键部署,包含cookie配置、回复规

PeterPan的博客 144

C#上位机+YOLO实战:从环境搭建到实现首个目标检测(零基础入门)

/ YOLOv8的类别名称(共80类,对应COCO数据集)// ONNX推理会话// YOLOv8的输入宽度// YOLOv8的输入高度本文从技术选型、环境搭建到代码实现,详细介绍了如何将C#上位机与YOLOv8结合,实现基础的目标检测功能。整个过程避开了常见的坑点,同时对核心原理和代码逻辑进行了详细解析,希望能帮助零基础的开发者快速入门。实际上,C#上位机+YOLO的组合在工业领域有非常广泛的应用,本文的案例只是一个起点。

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

数据库面试必备:MySQL 中的 MVCC 机制详解

MVCC(Multi-Version Concurrency Control,多版本并发控制)是 MySQL 中 InnoDB 存储引擎实现的一种并发控制机制。它通过在数据库中维护数据的多个版本,使得读操作不会阻塞写操作,写操作也不会阻塞读操作,从而提高了数据库的并发性能。

qq_58299462的博客 1008

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

MySQL数据库MVCC机制底层原理详解

由于min_id是所有未提交事务中最小的id,所以事务id小于min_id的一定是已经提交的事务是可见的,同时大于max_id的事务,是生成快照时还没有创建的事务,是不可见的,在min_id和max_id之间的事务要分两种情况,在未提交数组中则说明是不可见的,不在则说明事务已经提交是可见的,当执行查询语句,就会沿着版本链从最新的数据开始查,直到查到可见的数据。接下来执行第5行,同样是一个写操作也会生成事务id,同时上面我们说过,对于被修改的数据行还会生成一个数据版本,于是这个新生成的。

2303_78892316的博客 1393

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

深入详解MYSQL的MVCC机制

参考资料。

qq_23095607的博客 881

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

一篇文章搞懂MVCC多版本控制机制

摘要:MVCC(多版本并发控制)是数据库处理并发读写的机制,通过快照读和Undo Log实现。快照读读取历史版本数据,当前读获取最新数据。Undo Log保存数据变更前的快照,配合行记录的隐式字段(事务ID和回滚指针)形成版本链。ReadView根据事务隔离级别决定可见性规则:RC每次查询生成新ReadView,RR只在首次查询生成。MVCC解决了不可重复读问题,RC隔离级别下仍存在不可重复读,而RR通过固定ReadView保证事务内数据一致性。Serializable和Read Uncommitted不使

记录,是一种习惯;坚持,是一种品质。 668

Mysql基础(十二):隔离/锁/MVCC/ReadView

1、业务系统并发对数据库执行事务 在业务系统里会开启事务来执行增删改操作的,业务系统执行一个事务,每个事务里可能是一个或多个增删改语句 业务系统很可能是基于多线程并发的对MySQL数据库去执行多个事务的,那么每个事务里面的多个SQL语句都是如何执行的呢? 这里就有很多问题了: 1)、多个事务并发执行的时候,可能会同时对缓存页里的一行数据进行更新,这个冲突怎么处理?是否要加锁? 2)、可能有的事务在对一行数据做更新...

mingyuli的博客 2097

面试官:MySQL 为什么要是使用 MVCC?原理是什么?

MVCC 是 MySQL 中非常重要的一个并发优化,从事务隔离级别、版本链、ReadView 这几个方面着手,很容易理解 MVCC 的原理。文章来自网上,侵权请联系博主。

2401_85280106的博客 687

MySQL的MVCC及实现原理

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

qq_40875747的博客 468

初识mysql数据库之MVCC机制与视图

本文介绍了mysql中用于实现回滚和隔离性的MVCC机制的概念即其中包含了read view的内容,同时也介绍了在mysql中的视图的概念

Masquerena114514的博客 896

redo mysql mvcc_Mysql之MVCC系列

MySQL数据库的日志系统共有三种日志,具有不同的作用,承担着不同的角色,共同保障数据库的稳定。它们分别是redo log(重做日志,用于断电后数据的灾后恢复),bin log(归档日志,用于将数据恢复到之前任意时间节点的状态)以及undo log(用于事务提交前的数据回滚)。本文主要对MVCC及undo log进行详细的说明。概念MVCC的全称是 multi version concurrenc...

weixin_35529833的博客 141

【MySQL】MVCC详解与MVCC实现原理(MySQL专栏启动)

本文是:MySQL事务隔离机制与实现原理详解,的深入学习,我们在了解MySQL事务隔离机制与实现原理后,了解什么是MVCC,MVCC的实现原理,最后辨析当前读和快照读与MVCC和事务隔离的关系,更加全面和深入的MySQL事务隔离机制。

小明的Java问道之路 6668

PostgreSQL、oracle、mysql中MVCC机制详解

1、MVCC介绍 1.1、事务隔离级别 MVCC,Multi-version Concurrency Control ,顾名思义指的是多版本并发控制。在介绍MVCC之前我们先来简单了解下事务的隔离级别: read uncommitted:脏读,一个事务可以读到另外一个事务未提交的数据,大多数关系型数据库不支持。 read committed:提交读,一个事务可以读到其他事务已经提交的数据,大多数数据库的缺省模式。 repeatable read:一个事务执行过程中访问的数据是一致的,也就是一个事务中多次读

Focus on PostgreSQL 6000

Database-浅谈Postgresql与Mysql的MVCC实现机制

Database-Postgresql与Mysql的MVCC多版本并发控制原理MVCC介绍Postgresql中MVCC的实现 MVCC介绍 在早期的数据库理论中,一行元组上有两种锁,一种读锁,一种写锁,读会阻塞写,写也会阻塞读,这对于一个并发繁忙的系统来说代价是异常高昂的。 对于传统数据库来说,为了维护数据的一致性和完整性,避免一个事务看到其它并发事务更新而导致看到不一致的数据,通常采用的是LO...

adson1987的博客 6237

mysql的MVCC机制详解

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

qq_1149513559的博客 2749

MySQL MVCC 机制详解

MVCC 是 MySQL InnoDB 存储引擎中实现高并发的关键技术,通过在每行记录后面保存两个隐藏的列(事务ID和回滚指针)来实现的。它能够让不同事务的读、写操作并发执行,同时保证事务的隔离性。根据不同的隔离级别,MySQL 会采用不同的策略来创建和维护 ReadView,从而影响数据的可见性。

weixin_46376562的博客 1107
上一篇: 关于在 MySQL 的可重复读隔离级别下出现幻读详解
下一篇: 在本地Java 应用程序中模拟真实生产环境进行 JVM 调优学习
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值