跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
SQL

MySQL MVCC 实现原理

MySQL InnoDB 引擎中 MVCC(多版本并发控制)的实现原理。通过隐藏字段(事务 ID、回滚指针、行 ID)、Undo Log 版本链以及 Read View 可见性判断机制,实现了读写并发不阻塞。详细阐述了 RC 和 RR 隔离级别下 Read View 的生成时机差异,以及快照读与当前读的区别,说明了 MVCC 如何提升数据库并发性能。

星星泡饭发布于 2026/3/25更新于 2026/7/2047 浏览
MySQL MVCC 实现原理

MySQL MVCC 实现原理

一、MVCC 是什么?

MVCC(Multi-Version Concurrency Control,多版本并发控制)是数据库管理系统常用的一种并发控制方法,旨在提高读写并发性能,避免读写操作相互阻塞。

二、实现原理

MVCC 的实现主要依赖以下三个核心组件:

1. 隐藏字段

每一行记录除了用户定义的列,还有三个隐藏列:

  • DB_TRX_ID:最近修改该行记录的事务 ID。
  • DB_ROLL_PTR:回滚指针,指向该行上一个版本的 undo 日志记录,用于构建版本链。
  • DB_ROW_ID:隐含的自增 ID(如果表没有主键,InnoDB 会用它来组织聚簇索引)。

2. Undo Log 日志

  • 当一行记录被修改时,InnoDB 会将旧的一整行记录包括隐藏字段写入 Undo Log,并通过 DB_ROLL_PTR 将新版本与旧版本链接起来,形成版本链。
  • 版本链的头节点就是当前记录(最新版本),后续版本通过回滚指针找到。

3. Read View(读视图)

Read View 是事务执行快照读时生成的'快照',它记录了系统中活跃的事务 ID 列表(即尚未提交的事务)。通过 Read View,可以判断版本链中的哪个版本对当前事务是可见的。隔离级别 读已提交(Read Committed)就是通过这个来判断的。

Read View 主要包含:

  • m_low_limit_id:高水位,大于等于该值的所有事务 ID 均不可见。(注:事务 ID 是自增的,m_low_limit_id = 当前系统已有最大事务 ID + 1,如果出现 id >= m_low_limit_id 说明生成 ReadView 时这个 id 对应的事务还没开启,所以这行记录不可见)
  • m_up_limit_id:低水位,活跃事务 ID 列表中的最小 id,小于该值的事务 ID 均可见(已提交)。
  • m_ids:活跃事务 ID 列表,即生成 Read View 时尚未提交的事务集合。m_up_limit_id < id < m_low_limit_id,且 id 不在活跃事务 ID 列表则可见。
示例

假设当前系统已有事务 ID 1、2、3、4、5。生成 Read View 时:

  • 活跃事务:3、5(尚未提交)
  • 已提交事务:1、2、4
  • 下一个事务 ID 为 6

则:

  • m_up_limit_id = 3
  • m_low_limit_id = 6
  • m_ids = [3, 5]

可见性判断:

  • 版本的事务 ID = 1 → < 3 → 已提交 → 可见
  • 版本的事务 ID = 2 → < 3 → 已提交 → 可见
  • 版本的事务 ID = 3 → 在 m_ids 中 → 尚未提交 → 不可见
  • 版本的事务 ID = 4 → 在 [3,6) 范围内且不在 m_ids → 已提交 → 可见
  • 版本的事务 ID = 5 → 在 m_ids 中 → 不可见
  • 版本的事务 ID = 6 → ≥ 6 → 尚未开始 → 不可见

即使事务 6 在生成 Read View 后立即提交,它对当前事务仍然不可见,因为快照中不包含它。

三、不同隔离级别下的 Read View 生成时机

  • READ COMMITTED(RC):每次执行快照读时,都重新生成一个新的 Read View。这意味着在同一个事务中,多次 SELECT 可能看到不同的数据,如第一次 SELECT 某字段是某一值,这时有其他事务修改并提交了这个字段,第二次 SELECT 就会查到另一个值。
  • REPEATABLE READ(RR):只在事务第一次执行快照读时生成一个 Read View,后续所有快照读都复用这个 Read View。这样就保证了可重复读(同一个事务中多次读取相同数据,结果不变)。

快照读与当前读

  • 快照读:普通的 SELECT 语句,不加锁,利用 MVCC 读取历史版本,不会阻塞其他事务。
  • 当前读:SELECT ... FOR UPDATE、UPDATE、DELETE、INSERT 等操作,读取的是记录的最新版本,并且会对读取的记录加锁(行锁、间隙锁等),以保证数据一致性。

MVCC 主要作用于快照读,当前读则需要依赖锁机制来避免并发写冲突。

四、总结

MVCC 通过为每行记录维护多个版本,结合事务启动时生成的 Read View,使得读操作无需加锁即可获得一致性的数据视图,极大地提升了数据库的并发性能。InnoDB 利用隐藏列和 undo 日志实现版本链,并通过 Read View 的可见性规则隔离不同事务的影响,实现了 RC 和 RR 隔离级别下的非锁定读。

目录

  1. MySQL MVCC 实现原理
  2. 一、MVCC 是什么?
  3. 二、实现原理
  4. 1. 隐藏字段
  5. 2. Undo Log 日志
  6. 3. Read View(读视图)
  7. 示例
  8. 三、不同隔离级别下的 Read View 生成时机
  9. 快照读与当前读
  10. 四、总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 机器人具身智能:核心定义、指标与标准
  • C++备忘录模式:优雅实现对象状态保存与恢复
  • 拒绝等距透视手绘地狱!AIGC联动2D图像巨头:2.5D次世代废墟建筑极速量产
  • Flutter 底部导航与顶部选项卡实战:状态保持与鸿蒙适配
  • 基于腾讯云 HAI 与 DeepSeek 设计个人网页
  • Web 服务架构与 I/O 模型实战指南
  • VS Code 配置 C/C++ 编程运行环境
  • SkyWalking Kafka 与 RabbitMQ 消息链路追踪实践
  • Linux Netlink Socket 原理与实战:全面对比 TCP 通信
  • 使用 Text Generation WebUI 进行大模型 LoRA 微调指南
  • OpenClaw 本地 AI 助手部署与飞书对接指南
  • 模拟算法专题:替换问号、提莫攻击等 5 题详解
  • AI 时代产品核心功能落地全流程管控方法
  • 双指针算法实战:移动零与复写零详解
  • 攻防世界 Web 漏洞题解:Lottery 与 ics-05
  • 本地部署 Stable Diffusion 3.5 完整教程
  • 基于 Unity 2022 与 UXR SDK 的 Rokid AR 消消乐开发实践
  • 国内 Stable Diffusion 与 LLaMA 模型镜像站清单及微调实战
  • GPT、LLaMA 与 MOE:自回归模型与混合专家架构演进
  • CentOS 7 Docker 完整安装与配置指南

相关免费在线工具

  • SQL 美化和格式化

    在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online

  • SQL转CSV/JSON/XML

    解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online

  • CSV 工具包

    CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online