跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书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/9/1277 浏览
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. 四、总结

更多推荐文章

查看全部
  • 基于用户画像的 Python 音乐推荐系统:Django 协同过滤与 SVD 算法
  • AI 驱动下内存价格暴涨原因及未来趋势分析
  • 潜在扩散模型(LDMs)深度解析与架构原理
  • C++ 虚函数与纯虚函数:多态机制的深度解析
  • 构建与 GitHub 深度集成的自动化工作流指南
  • Flutter 三方库 wallet_connect 的鸿蒙化适配指南:Web3 钱包连接与 DApp 授权
  • Z-Image-Turbo 镜像快速搭建与 AI 绘画教学指南
  • CTF easy_hash 题目解析:多项式与自定义哈希逆向
  • QGIS Python 编程秘籍(一)
  • Llama-3.2-3B 部署优化:Ollama 配置上下文窗口与 Token 限制
  • Kotlin 异常处理核心:Try 表达式、Nothing 类型与 Java 交互
  • Flutter 库 llm_json_stream 的鸿蒙化适配与流式 JSON 解析
  • 人形机器人躯干系统:结构方案与驱动设计
  • Flutter 组件 Genkit 在鸿蒙端的适配:模型幻觉审计与 RAG 向量对齐方案
  • Python 字典 dict 的常用用法与底层原理
  • 利用 Web Scraper 插件爬取知乎评论数据实战
  • DocxFactory:基于 C++ 的 Word 文档生成库(无需 Office)
  • Open Notebook 开源工具:简介、安装部署与案例应用详解
  • SubtitleEdit Purfview Faster Whisper XXL 引擎安装失败修复指南
  • 昇腾平台 cann-recipes-train 仓库:DeepSeek-R1 与 Qwen2.5 强化学习训练优化

相关免费在线工具

  • 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