Undo Log:事务回滚是怎么实现的?
回滚要解决什么事务执行到一半报错了或者用户主动敲了ROLLBACK已经改掉的那些数据得变回去。怎么变回去有两条路改之前先把整个页或者整行拷一份回滚的时候原样写回去记下这次修改的反向操作是什么回滚的时候照着做一遍InnoDB 选的是第二条。undo log 里记的不是旧数据长什么样而是怎么把这次修改撤掉这个区别很关键后面讲 MVCC 复用的时候会用到。undo log 记的是什么三种写操作记的东西不一样操作undo log 里记的回滚时做什么INSERT主键还有唯一索引的值按主键把这一行删掉DELETE整行的所有列 主键把这一行重新插回去UPDATE被改字段的旧值 主键把字段改回旧值INSERT是最省的它不需要记旧值因为原来根本没有这一行记个主键就够回滚用了。DELETE反过来最费行都没了重建它得知道每一列是什么所以整行都得记。这也是为什么DELETE产生的日志量比INSERT大。UPDATE有个特殊情况如果更新的是主键InnoDB 会把它拆成DELETEINSERT两步。因为主键决定了记录在页里的位置改了主键相当于这条记录挪了地方不是原地改几个字节能解决的。这里要强调 undo log 是逻辑日志它记的是把 id 1 这行的 name 改回 ‘a’“不是把页号 5 偏移 100 处的字节恢复成原来的值”。为什么不能做物理恢复因为一个数据页上可能同时躺着好几个事务的修改页是共享的。如果回滚事务 A 的时候把整个页按快照写回去事务 B、C 在同一页上的修改会被一起抹掉。只有按事务维度做逻辑的反向操作才能只撤自己的那一份。undo log 本身也要写 redo log这个地方容易绕进去undo log 不是凭空存在的它也存在 undo 页里而 undo 页是要持久化的。所以一个UPDATE实际发生的是1. 先把 undo 记录写进 undo 页 这次对 undo 页的修改会产生 redo log 2. 再修改数据页 这次对数据页的修改也会产生 redo log也就是说redo log 保护的不只是数据页还有 undo 页。崩溃恢复的时候如果 undo 页的修改也没来得及落盘照样能从 redo log 里把它重放出来然后才能拿它去回滚别的事务。这里的重放具体怎么做可以回顾一下 Redo LogMySQL 为什么能够实现崩溃恢复里的恢复流程。这也解释了一个看起来矛盾的顺序问题undo 明明是先写的为什么还要靠 redo 保护因为 redo 保护的是undo 这个写入动作本身不会丢两件事不冲突。两个用途回滚是本职undo log 的存在意义是回滚MVCC 的读历史版本是顺带复用的同一份数据。具体的机制在 MVCC 的版本链里讲过每次修改前把旧值写进 undo log用DB_ROLL_PTR把同一个行的各个版本串成链表事务读的时候顺着链找到自己可见的那个版本。和回滚的关系可以用一句话概括回滚是沿着版本链往回走MVCC 是沿着版本链往回找。走的是同一条链目的地不一样。什么时候可以删undo 记录不是提交完就能删的。两种 undo类型来源提交后能不能立刻删insert undo logINSERT能因为它产生的行本来就只对当前事务可见update undo logUPDATE、DELETE不能它是版本链的来源别的事务可能还要读insert undo log之所以能立刻删是因为它记录的那行数据是当前事务造出来的事务没提交之前别人根本看不见提交之后这条 undo 记录也就没有用了。update undo log不行。假设事务 A 把name从a改成了b并提交事务 B 在 A 提交之前就开了它读这行的时候要看到a所以记录着旧值a的那条 undo 记录必须留着直到 B 结束。purge 线程怎么判断清理这件事由后台的 purge 线程做判断依据是再没有事务需要看这个版本了。InnoDB 里维护着当前所有活跃事务的信息purge 线程拿 undo 记录归属的事务 ID 去和活跃事务列表比如果这个 ID 比所有活跃事务的 ID 都小说明没有任何一个还没结束的事务会需要比它更早的版本了这条记录就可以清理。清理的时候不只是把 undo 页回收还要把数据页上对应的那条delete mark记录真正删掉DELETE在 InnoDB 里其实是打个删除标记真正的物理删除也是 purge 干的。长事务为什么危险一个事务开了很久不提交会有两个后果第二个才是真正麻烦的。一是它自己的 undo 清理不掉。这个好理解事务还没结束它改过的东西都还不能确定最终是什么样。二是它会挡住别人的 undo 清理。purge 只能清理比活跃事务更早的版本而长事务作为一个一直活着的旧事务会把这条线死死钉在原地。它后面产生的所有 undo 记录哪怕那些事务早就提交了都得排队等着。所以线上 undo 表空间从几百 MB 涨到几十 GB往往不是因为单个大事务而是因为某个忘了提交的连接一直挂着。排查的时候看information_schema.innodb_trx里trx_started时间很早的那些记录基本就是这个原因。

相关新闻

RT-Thread 在 GD32VF103V_EVAL(RISC-V 内核)上的 BSP 移植与实践指南

RT-Thread 在 GD32VF103V_EVAL(RISC-V 内核)上的 BSP 移植与实践指南

操作系统嵌入式物联网嵌入式OSRTOS 【免费下载链接】rt-thread RT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/ 项目地址: https://gitcode.com/gh_mirrors/rt/rt-thread 点击查看 免费下载 本指南围…

2026/9/24 5:48:03 阅读更多 →
Numba 环境变量完全指南:从 `.numba_config.yaml` 到 `NUMBA_*` 全量配置解析

Numba 环境变量完全指南:从 `.numba_config.yaml` 到 `NUMBA_*` 全量配置解析

编译器高性能计算 【免费下载链接】numba NumPy aware dynamic Python compiler using LLVM 项目地址: https://gitcode.com/gh_mirrors/nu/numba 点击查看 免费下载 Numba 通过一组以 NUMBA_ 前缀开头的环境变量,允许开发者在不修改代码的前提下动态改…

2026/9/24 5:48:03 阅读更多 →
专知智库·研发增长系统:一套系统,双重合规,三重增长

专知智库·研发增长系统:一套系统,双重合规,三重增长

专知智库研发增长系统:一套系统,双重合规,三重增长研发费用管理,早已超越简单的税务申报范畴!在金税四期的严密监管下,税务合规是底线;而对于谋求上市的企业,证监会《第九号指引》对…

2026/9/24 5:48:03 阅读更多 →

最新新闻

GitHub游戏skills清单:49个AI员工与16星冷门项目的选型指南

GitHub游戏skills清单:49个AI员工与16星冷门项目的选型指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 6:32:31 阅读更多 →
K线数据质量校验与清洗:从原始数据到可回测数据的完整指南

K线数据质量校验与清洗:从原始数据到可回测数据的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 6:32:31 阅读更多 →
华擎主板BIOS刷写避坑指南:CH341A实操风险与SPI芯片安全操作

华擎主板BIOS刷写避坑指南:CH341A实操风险与SPI芯片安全操作

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 6:32:31 阅读更多 →
hot 100

hot 100

day 2:给你一个字符串数组,请你将字母异位词 组合在一起。可以按任意顺序返回结果列表这道题的思路,一开始是也是想暴力求解,把字符串转换为字符数组,再进行排序,然后拿每一个字符和后面的字符比较&#xf…

2026/9/24 6:31:31 阅读更多 →
2026 年国内 AI API 聚合平台实测排名 Top10(稳定性 / 价格 / 模型数全维度)

2026 年国内 AI API 聚合平台实测排名 Top10(稳定性 / 价格 / 模型数全维度)

实测时间:2026 年 9 月 | 测试方式:真实调用 60 并发压测 价格核算 排名依据:模型覆盖数、可用率、价格水平、协议完整性 四项实测数据加权 本文数据均来自实际测试,每项结论均标注依据。欢迎指正。一、2026 年国内 AI API 聚合…

2026/9/24 6:31:31 阅读更多 →
使用 Acorn 打包与部署 FerretDB 应用:Python Flask 应用的云原生实战

使用 Acorn 打包与部署 FerretDB 应用:Python Flask 应用的云原生实战

后端数据库文档数据库 【免费下载链接】FerretDB A truly Open Source MongoDB alternative 项目地址: https://gitcode.com/gh_mirrors/fe/FerretDB 点击查看 免费下载 FerretDB 是一款真正开源的 MongoDB 替代方案,可将 PostgreSQL 作为文档数据库后端…

2026/9/24 6:31:31 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →