news 2026/5/1 10:08:20

什么是版本链?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
什么是版本链?

在 MySQL InnoDB 的 MVCC 机制中,版本链是一行数据的所有历史版本通过回滚指针串联起来的单向链表,它是实现快照读的核心数据结构。

一、版本链的构成要素

版本链的每一个节点,都是一行数据的一个历史版本,而串联这些节点的关键,就是 InnoDB 为每行数据隐式添加的两个字段:

  1. DB_TRX_ID标记创建这个版本的事务 ID,相当于给这个版本贴了一个 “身份标签”。
  2. DB_ROLL_PTR(回滚指针)这是版本链的 “链条”,它指向当前版本的上一个历史版本(这个历史版本存储在undo log中)。

除此之外,每行数据的最新版本会直接存储在数据页中,而历史版本则全部保存在undo log里。

二、版本链的生成过程(一步一步拆解)

我们用一个具体的例子,看一行数据的版本链是如何随着事务操作逐步变长的。假设表user有一行初始数据:id=1, name="张三",此时它的隐藏字段状态:

  • DB_TRX_ID = 0(表示这是初始化版本,无事务修改)
  • DB_ROLL_PTR = null(无历史版本,链表头)
步骤 1:事务 101 执行 UPDATE(第一次修改)
BEGIN; UPDATE user SET name = "李四" WHERE id = 1; COMMIT;

InnoDB 的处理逻辑:

  1. 先把当前行的原始版本name=张三, DB_TRX_ID=0, DB_ROLL_PTR=null)拷贝到undo log中;
  2. 修改数据页中的当前行:name=李四,更新隐藏字段:
    • DB_TRX_ID = 101(标记是事务 101 修改的)
    • DB_ROLL_PTR = 指向 undo log 中的原始版本
  3. 此时版本链结构:
    数据页当前版本(101: 李四) → undo log 历史版本(0: 张三)
步骤 2:事务 102 执行 UPDATE(第二次修改)
BEGIN; UPDATE user SET name = "王五" WHERE id = 1; COMMIT;

InnoDB 的处理逻辑:

  1. 把数据页中的当前版本name=李四, DB_TRX_ID=101, DB_ROLL_PTR=指向旧版本)拷贝到undo log
  2. 修改当前行:name=王五,更新隐藏字段:
    • DB_TRX_ID = 102
    • DB_ROLL_PTR = 指向 undo log 中的 101 版本
  3. 此时版本链变长:
    数据页当前版本(102: 王五) → undo log 版本1(101: 李四) → undo log 版本2(0: 张三)
核心规律
  • 每次UPDATE/DELETE操作,都会生成一个新的历史版本,并追加到版本链尾部;
  • INSERT操作不会生成历史版本(因为插入前该行不存在),所以不会影响版本链;
  • 版本链的遍历方向是从当前版本到最旧版本

三、版本链的核心作用

版本链的唯一作用,就是为快照读提供历史版本数据,配合Read View实现 “读不阻塞写”。

具体流程是:

  1. 事务执行快照读(普通SELECT)时,会生成一个Read View(版本可见性规则);
  2. 先读取数据页中的当前版本,用Read View判断这个版本是否可见:
    • 如果可见,直接返回;
    • 如果不可见,就通过DB_ROLL_PTR遍历版本链,去undo log中找下一个历史版本;
  3. 重复步骤 2,直到找到第一个符合Read View规则的可见版本,返回该版本数据。

四、版本链的清理机制

版本链不会无限变长,否则undo log会越来越大,占用大量磁盘空间。InnoDB 的purge 线程会定期清理版本链中不再需要的历史版本—— 判断标准是:

没有任何活跃事务的Read View会用到这个历史版本。

比如,所有事务的快照读都不需要访问undo log中的 0 版本了,purge 线程就会把这个版本从undo log中删除,版本链也会相应缩短。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 7:07:48

JAVA进阶 THREAD学习12 多线程小结

多线程安全问题的应对 首先有前面的分析得出多线程的安全问题是由共享资源的修改混乱导致的。 那么我们根据这两个关键的点做出应对: 避开使用共享资源 使用没有共享资源的模型 避开修改 对共享资源只读不写使用不可修改的内容 直接应对线程安全问题 原子性顺序性可…

作者头像 李华
网站建设 2026/4/26 23:06:27

Go Web框架全面对比:哪一款最适合你的项目?

Go语言(Golang)自发布以来,以其简洁的语法、高效的性能以及出色的并发支持,成为了现代Web开发中一个重要的选择。Go本身是一个非常强大的语言,但由于Go的标准库并不提供一个“完整”的Web框架,许多社区开发…

作者头像 李华
网站建设 2026/4/27 10:54:27

Java开发的AI应用框架简述——LangChain4j、Spring AI、Agent-Flex

LangChain4j LangChain4j官网 star很多,文档齐全,在AI服务中,提供了丰富的功能,示例代码丰富。 简介 是一个功能丰富、易于使用的Java AI开发框架,特别适合需要快速集成和使用大型语言模型的Java开发者。 项目特点 …

作者头像 李华
网站建设 2026/5/1 9:39:03

基于 ANFIS 的非线性回归(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

作者头像 李华
网站建设 2026/5/1 8:43:39

FastAPI 路径操作依赖项

FastAPI 路径操作依赖项 引言 FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,由 Python 3.6+ 支持并基于标准 Python 类型提示。依赖项是 FastAPI 中一个强大的特性,它允许我们在请求处理期间执行各种操作,例如身份验证、数据验证、权限检查等。本文将深入…

作者头像 李华
网站建设 2026/4/25 8:00:10

亲测好用10个AI论文工具,专科生轻松搞定论文写作!

亲测好用10个AI论文工具,专科生轻松搞定论文写作! AI 工具助力论文写作,专科生也能轻松应对 在如今的学术环境中,AI 工具正逐渐成为学生和研究者不可或缺的助手。尤其是在论文写作过程中,AI 不仅能够帮助提高效率&…

作者头像 李华