MySQL 初阶——多版本控制 MVCC

一、版本链(undo 日志)

a. 什么是版本链

版本链就是一条以事务为节点的单链表。其 next 指针指向前一个版本的事务。

b. 版本链的增删

当一个事务被完成时,这个事务就会被加入到版本链里去;当要回滚时,版本链就会删除一些节点,使得头节点是回滚后的事务的上一个旧版本。而如果要更新 MySQL 中的表的内容时,更新前的内容会被拷贝一份并加入版本链里面,然后再改表的内容,最后把这个事务 ID 在原来的旧版本上加 1.

举个例子,假如现在已经有这个记录:

  1. 我们现在要把这个记录中的名字改成 "李四" ,要经过以下步骤:
    步骤一:标题把原记录拷贝一份到 undo 日志中(添加到版本历史链中)

步骤二:修改 name,事务 ID 和回滚指针,使其这向上一个版本的记录

再举个例子,假如我们要接着把"李四"的那条记录里的年龄改成 38 岁,也还是继续以下操作:
步骤一:把李四那条记录拷贝一份到 undo 日志中(添加到历史版本链里) 步骤二:修改年龄、事务 ID和回滚指针的指向,使其指向上一个版本的记录

二、如何通过版本链实现多版本控制

a. 如何实现回滚?

其实原理很简单,就是把上一个版本的记录从 undo 日志拿出来,覆盖到当前版本上就行了。举个例子,假如我要回滚到最开始那条记录:
最开始的那条记录

此时历史版本链为这样:

那么 MySQL 就会按一下步骤运行:
步骤一:第一次回滚 步骤二:第二次回滚,回滚完成

b. 历史版本链如何存插入、删除操作的事务

其实也很简单,在拷贝记录时,如果是插入操作,就把进入 undo 日志的那条记录标记为删除操作;如果是删除操作,就把进入 undo 日志的那条记录标记为插入操作。到时候回滚时直接按着所记录的操作运行就行了。

相关推荐
白帽攻防录2 小时前
SRC 挖洞:Roundcube 预认证 SQL 注入深度复盘,CVE-2026-48842 preg_replace 转义绕过怎么打穿邮件系统
网络·数据库·sql·网络安全·sql注入
꯭自꯭闭꯭2 小时前
达梦SQL优化相关
linux·运维·数据库·sql
nhdh2 小时前
B+树揭秘:MySQL索引核心原理全解析
数据结构·b树·mysql
对空六课3 小时前
支持注意力分析的热力图工具有哪些?
前端·数据库·数据分析
南京码讯光电技术有限公司3 小时前
How to Design an Antenna System for an Industrial WiFi Module
数据库·人工智能
lusklusklusk4 小时前
Oracle数据库基础之2_体系结构
数据库·oracle
可乐ea5 小时前
从第一性原理构建 AI Agent:提示词、工具、技能与记忆全解剖
数据库·人工智能·工具调用·ai智能体·提示词工程·agent开发·智能体记忆
余槐i5 小时前
MySQL 深分页从 4 秒到 60 毫秒:延迟关联减少回表的实测与代价
mysql·性能优化·sql优化·执行计划·慢查询优化
东方护航数据恢复(深圳)5 小时前
医疗案例:HIS/PACS 数据库页损坏修复,医院不停诊完成恢复【东方护航数据恢复深圳店】
数据库·数据恢复·医疗·二次开盘
lusklusklusk6 小时前
Oracle数据库基础之11_Duplicate和Dataguard和RAC
数据库·oracle