MySQL InnoDB的 MVCC 实现机制
MySQL InnoDB的 MVCC 实现机制1. MVCC概述什么是 MVCC当前读和快照读MVCC 与锁机制的组合2. MVCC的实现原理隐式字段记录的版本元数据Undo Log版本链的存储载体Undo Log 的分类版本链的形成过程Read View版本可见性的判断规则不同隔离级别下的 Read View1. MVCC概述什么是 MVCCMVCCMulti-Version Concurrency Control即多版本并发控制是数据库领域中一种核心的并发控制技术不仅广泛应用于数据库管理系统DBMS以支撑高并发的数据库访问场景也在部分编程语言的事务内存实现中发挥重要作用。在 MySQL 的 InnoDB 存储引擎中MVCC 的核心设计目标是提升数据库的并发处理能力。传统的锁机制在处理读写冲突时往往需要通过加锁阻塞来保证数据一致性这会显著降低并发效率而 MVCC 创新性地解决了读 - 写冲突问题 —— 即便存在读写操作的并发执行也能做到不加锁、非阻塞的并发读极大地优化了数据库在高并发场景下的性能表现。当前读和快照读要理解 MVCC 的工作逻辑首先需要区分数据库中的两种核心读取方式当前读和快照读。1、当前读当前读是指读取记录的最新版本且为了保证数据的一致性和排他性读取过程中会对目标记录加锁防止其他并发事务修改该记录。典型的当前读操作包括加共享锁的查询SELECT ... LOCK IN SHARE MODE其他事务可读取该记录但无法修改直到共享锁释放加排他锁的操作SELECT ... FOR UPDATE、UPDATE、INSERT、DELETE这类操作会获取记录的排他锁其他事务既无法读取加锁读也无法修改该记录直到排他锁释放。当前读的本质是悲观锁的实现通过强制加锁的方式规避并发修改风险但也不可避免地带来了锁竞争和阻塞问题2、快照读快照读是指不加锁的非阻塞读取也是日常开发中最常用的读取方式如普通的SELECT操作。快照读的核心支撑就是 MVCC—— 它并不直接读取记录的最新版本而是读取数据的某个历史版本快照从而避免了与写操作的锁冲突。可以将 MVCC 理解为行锁的一种 “变种”但它在绝大多数场景下避免了显式加锁操作大幅降低了锁机制带来的性能开销。需要明确的是MVCC 解决的是快照读与写操作之间的冲突而非当前读的冲突。MVCC 与锁机制的组合数据库的并发冲突主要分为两类读 - 写冲突、写 - 写冲突。MVCC 本身无法解决写 - 写冲突因此需要与锁机制结合形成两种经典的组合方案MVCC 悲观锁MVCC 处理读 - 写冲突快照读无锁悲观锁如行锁、表锁处理写 - 写冲突通过加锁阻塞避免并发修改MVCC 乐观锁MVCC 处理读 - 写冲突乐观锁如基于版本号 / 时间戳的校验处理写 - 写冲突无锁阻塞通过版本比对解决冲突。这种组合模式既保证了数据一致性又最大化了数据库的并发处理能力也是 InnoDB 成为 MySQL 默认存储引擎的核心原因之一2. MVCC的实现原理MVCC 的实现并非单一技术而是由记录的隐式字段、Undo Log回滚日志和Read View读视图三大核心组件协同完成隐式字段记录的版本元数据InnoDB 中每行记录除了用户自定义的字段如name、age外还会自动生成若干隐式字段用于维护记录的版本信息核心隐式字段包括DB_ROW_ID6byte隐含的自增主键隐藏主键。若数据表未定义主键InnoDB 会以此生成聚簇索引DB_TRX_ID6byte事务 ID记录创建 / 最后一次修改该记录的事务 ID事务 ID 自增分配IDDB_ROLL_PTR 7byte回滚指针指向该记录上一个版本的 Undo Log形成版本链表DELETED_BIT1byte删除标记标记记录是否被 “删除”逻辑删除而非物理删除核心说明DB_ROW_ID仅在表无主键时生效是 InnoDB 保证聚簇索引存在的兜底方案DB_TRX_ID是版本判断的核心标识每一次修改记录都会更新该字段为当前事务 IDDB_ROLL_PTR是连接历史版本的关键通过它可以追溯记录的所有历史版本DELETED_BIT是 InnoDB逻辑删除的实现 —— 删除操作仅修改该标记不会立即物理删除记录为 MVCC 的版本链提供支持。Undo Log版本链的存储载体Undo Log回滚日志是 InnoDB 为事务回滚和 MVCC 提供的核心日志存储在磁盘的rollback segment 中。与 Redo Log重做日志保障事务持久性不同Undo Log 的核心作用是记录数据修改前的旧版本支持事务回滚同时为 MVCC 提供历史版本数据。Undo Log 的分类由于查询操作SELECT并不会修改任何用户记录所以在查询操作执行时并不需要记录相应的undo log根据操作类型Undo Log 分为三类其中对 MVCC 最关键的是Update undo logInsert Undo Log仅在插入操作时生成记录插入记录的主键值。事务回滚时只需根据主键删除该记录即可对 MVCC 无直接作用Update Undo Log修改记录时生成记录修改前的完整旧版本数据。这是 MVCC 的核心依赖 —— 每一次更新操作都会将旧版本数据写入Update Undo Log并通过DB_ROLL_PTR将当前记录与旧版本链接形成版本链表Delete Undo Log删除操作时生成记录被删除记录的完整内容。InnoDB 的删除操作是 逻辑删除 —— 仅将DELETED_BIT标记为 1而非物理删除记录事务回滚时只需将DELETED_BIT改回 0并恢复记录即可版本链的形成过程以person表的一条记录为例1、步骤 1初始插入记录事务 T0 插入一条记录nameJerryage24此时隐式字段状态DB_ROW_ID1自动生成DB_TRX_IDNULL无修改事务DB_ROLL_PTRNULL无历史版本DELETED_BIT0未删除。2、步骤 2事务 T1 修改记录name→Tom事务 T1 执行UPDATE person SET nameTom WHERE DB_ROW_ID1执行流程对该记录加排他锁防止并发修改将当前记录的完整数据nameJerryage24拷贝到 Update Undo Log作为第一个历史版本修改记录的name为 Tom更新DB_TRX_ID为 T1 的事务 ID假设为 1将DB_ROLL_PTR指向步骤 2 中生成的 Undo Log 记录事务提交释放排他锁。此时记录的最新版本指向 T1 的修改Undo Log 中保留了初始版本版本链初步形成3、步骤 3事务 T2 修改记录age→30事务 T2 执行UPDATE person SET age30 WHERE DB_ROW_ID1执行流程对该记录加排他锁将当前记录的完整数据nameTomage24拷贝到 Update Undo Log作为新的历史版本插入版本链的头部修改记录的age为 30更新DB_TRX_ID为 T2 的事务 ID假设为 2将DB_ROLL_PTR指向步骤 2 中生成的新 Undo Log 记录事务提交释放排他锁。最终该记录的版本链结构为最新版本nameTomage30TRX_ID2 → 历史版本1nameTomage24TRX_ID1 → 历史版本2nameJerryage24TRX_IDNULL版本链的核心特征链首是最新的历史版本链尾是最早的初始版本通过DB_ROLL_PTR串联Read View版本可见性的判断规则当事务执行快照读时InnoDB 会生成一个 Read View读视图它是当前事务可见的事务 ID 集合的快照核心作用是判断当前事务能看到版本链中的哪个版本。Read View 包含四个关键属性以 RC 隔离级别为例m_ids生成 Read View 时系统中所有活跃的事务 ID 列表未提交的事务min_trx_idm_ids中的最小值最早开启的活跃事务max_trx_id生成 Read View 时系统即将分配的下一个事务 IDcreator_trx_id生成该 Read View 的当前事务 ID。Read View 通过对比记录的DB_TRX_ID事务 ID与自身属性判断该版本是否对当前事务可见判断规则如下若记录的DB_TRX_ID creator_trx_id该记录由当前事务修改可见若记录的DB_TRX_ID min_trx_id修改该记录的事务已提交可见若记录的DB_TRX_ID max_trx_id修改该记录的事务在生成 Read View 后才开启不可见若min_trx_id ≤ DB_TRX_ID max_trx_id若DB_TRX_ID在m_ids中事务未提交不可见若DB_TRX_ID不在m_ids中事务已提交可见。若当前版本不可见则通过DB_ROLL_PTR遍历版本链依次判断下一个历史版本直到找到第一个可见的版本这就是当前事务快照读能看到的最终数据。不同隔离级别下的 Read ViewMySQL 的隔离级别读未提交、读已提交、可重复读、串行化中Read View 的生成策略是区分 “读已提交RC” 和 “可重复读RR” 的核心读已提交RC每次执行快照读时生成新的 Read View这样同一事务中多次快照读可能看到不同版本不可重复读可重复读RR事务中第一次执行快照读时生成 Read View后续复用这样同一事务中多次快照读看到的是同一版本可重复读InnoDB 的可重复读本质是通过 “复用 Read View” 实现的 —— 事务第一次快照读生成的 Read View会被该事务后续所有快照读复用因此即便其他事务提交了修改当前事务也不会看到保证了 “可重复读” 的特性。例如事务 ARR 隔离级别第一次快照读生成 Read Viewm_ids[2,3]此时事务 BTRX_ID4修改了记录并提交事务 A 后续的快照读仍复用最初的 Read View因此看不到事务 B 的修改实现了可重复读。

相关新闻

java+vue+springboot开题报告 军事训练登统计分析系统

java+vue+springboot开题报告 军事训练登统计分析系统

目录系统背景与意义技术栈选择核心功能模块系统创新点技术难点与解决方案预期成果项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作系统背景与意义 军事训练登记统计分析系统旨在解决传统军事训练管理中数据…

2026/5/17 2:29:28 阅读更多 →
windows电脑部署OpenClaw

windows电脑部署OpenClaw

windows电脑部署OpenClaw什么是OpenClawOpenClaw是一个运行在本地电脑的开源 AI 智能体。核心优势:特性说明接入聊天工具出门在外用手机给它留言,它就能自动干活,还能实时同步截图和执行过程定时任务系统用自然语言创建定时任务,如…

2026/5/17 2:29:28 阅读更多 →
全球药品追溯码扫码一体机市场报告2026-2032

全球药品追溯码扫码一体机市场报告2026-2032

药品追溯码扫码一体机是一种专为药品全生命周期追溯管理设计的集成化智能终端设备,它整合了高精度条码 / 二维码扫描模块、嵌入式数据处理单元、人机交互显示界面及无线 / 有线通信模块,主要应用于药店、医院药房、药品仓储物流节点及零售终端等场景。该…

2026/5/17 2:29:27 阅读更多 →

最新新闻

暗黑破坏神2存档编辑器:零基础快速修改角色与物品的终极指南

暗黑破坏神2存档编辑器:零基础快速修改角色与物品的终极指南

暗黑破坏神2存档编辑器:零基础快速修改角色与物品的终极指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 想要轻松修改暗黑破坏神2的存档文件吗?d2s-editor是一款专为暗黑破坏神2玩家设计的强大存档编…

2026/7/3 8:02:13 阅读更多 →
PD-1/PD-L1——免疫检查点靶点的标杆与进化

PD-1/PD-L1——免疫检查点靶点的标杆与进化

摘要 PD-1/PD-L1通路是哺乳动物免疫系统核心的免疫检查点调控通路,也是肿瘤免疫逃逸最关键、机制最清晰的信号轴。相较于CTLA-4、TIGIT、LAG-3等其他免疫检查点,PD-1/PD-L1凭借精准的免疫负调控原理、特异性的肿瘤激活机制、可逆的免疫抑制模式&#xff…

2026/7/3 8:02:13 阅读更多 →
OSXPhotos:macOS 照片库的命令行管理工具

OSXPhotos:macOS 照片库的命令行管理工具

文章目录OSXPhotos:macOS 照片库的命令行管理工具能做什么模板系统是亮点安装和使用适合谁用OSXPhotos:macOS 照片库的命令行管理工具 用 Mac 的人,照片库里多少都攒了几千上万张照片。时间一长,想找某张特定的照片,或…

2026/7/3 8:00:12 阅读更多 →
成年人必看!治愈一生的经典名著《小王子》

成年人必看!治愈一生的经典名著《小王子》

成年人必读的治愈经典,《小王子》从来不止是儿童童话,更是成年人的人生教科书。长大后才读懂,这本经典治愈书籍藏着我们所有的迷茫、遗憾与成长,也是当之无愧的人生必读名著。很多人年少读《小王子》,只记住了温柔的童…

2026/7/3 7:58:12 阅读更多 →
国际期货日内交易最佳交易时段

国际期货日内交易最佳交易时段

国际期货全天近 24 小时连续交易,不同时段资金量、波动幅度、流动性差异巨大,日内短线想要降低滑点、把握有效行情,优先选择欧美重叠盘,分三档时段区分优劣。最差时段为亚盘,北京时间 7:00 至 15:00,仅有亚…

2026/7/3 7:52:11 阅读更多 →
第19章:Celery 分布式任务队列深度解析

第19章:Celery 分布式任务队列深度解析

1. 项目背景 "我上传了一份 200 页的 PDF 到知识库,点击’保存并处理’后页面显示索引进度 0%。等了 30 分钟终于跳到 100%,中间我刷新了 5 次页面,每次都以为卡死了。"这是新手使用 Dify 知识库最常见的困惑。30 分钟里,Dify 的后台 Celery Worker 一直在拼命工…

2026/7/3 7:52:11 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻