首页/新闻资讯/正文详情

Undo Log:事务回滚是怎么实现的?

发布时间:2026/9/24 5:47:48 来源:云帆数科 栏目:资讯中心
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时间很早的那些记录基本就是这个原因。

相关推荐

PCB数字地与模拟地分离原理与实战策略
PCB数字地与模拟地分离原理与实战策略

/* 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 5:47:36

给RAG加一层HyDE——查询不改一改,白白损失20%召回
给RAG加一层HyDE——查询不改一改,白白损失20%召回

一句话带走:先让大模型"想象"答案,再用答案去搜,短查询召回率直接涨20%。 事情从一次翻车说起 上周三,同事跑过来跟我吐槽:他做的内部文档RAG,用户搜"怎么报销差旅费",命… · 2026/9/24 5:47:11

车载以太网转换盒拆解:100BASE-T1转100BASE-TX方案对比
车载以太网转换盒拆解:100BASE-T1转100BASE-TX方案对比

/* 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 5:47:11

被谷歌手动处罚了还有救吗?有,但九成人死在申诉这一步:完整流程照着走
被谷歌手动处罚了还有救吗?有,但九成人死在申诉这一步:完整流程照着走

排名突然暴跌,你慌慌张张打开 Search Console,结果看到一张红色的"手动操作"通知——谷歌真人审核员,亲手给你下了处罚。第一反应可能是:"完了,这站是不是没救了?"先别绝望。手动处罚不… · 2026/9/24 6:39:45

Keil MDK许可证错误排查与Arm Compiler配置实战指南
Keil MDK许可证错误排查与Arm Compiler配置实战指南

/* 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:39:21

Nginx UI 命令行接口(nginx-ui ctl)实战指南:基于管理 API 的自动化运维与配置即代码
Nginx UI 命令行接口(nginx-ui ctl)实战指南:基于管理 API 的自动化运维与配置即代码

后端前端运维MCP 服务 【免费下载链接】nginx-ui Yet another WebUI for Nginx 项目地址: https://gitcode.com/gh_mirrors/ngi/nginx-ui 点击查看 免费下载 nginx-ui ctl 是 Nginx UI 内置的远程管理客户端,它通过实例自身的管理 API 操作正在运行的 N… · 2026/9/24 6:39:14

Claude Opus 5.5 发布:更强且价降 40%
Claude Opus 5.5 发布:更强且价降 40%

Claude Opus 5.5 发布:更强且价降 40% 2026年9月22日,Anthropic 发布 Claude Opus 5.5,这是 Claude 5.5 家族的第一个成员。它把上一代 Opus 5 的 token 单价下调约 20%、缓存读取砍掉 60%,典型任务总成本反而比 Opus 5 低约 40%… · 2026/9/24 6:39:02

NLP-情感分析项目(三):RNN模型搭建
NLP-情感分析项目(三):RNN模型搭建

情感分析项目代码详解(三):textrnn.py 模型搭建前两篇完成了数据准备:词汇表建好了,文本也变成了定长的数字序列,还写好了分批读取的迭代器。这一篇开始搭建真正的"大脑"——情感分类模型。textr… · 2026/9/24 6:38:56

DAB双有源桥变换器:移相控制与软开关的工程实践指南
DAB双有源桥变换器:移相控制与软开关的工程实践指南

/* 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:38:38

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

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

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码