MySQL 事务回滚日志 Undo Log 怎么实现原子性与回滚

秋晨姑娘_9829

秋晨姑娘_9829

2026-09-03

434人浏览

原创

undo log通过记录数据修改前的旧值(如insert记主键、update记原值、delete记整行),在事务失败或rollback时执行反向操作,确保事务“全做或全不做”,从而实现原子性。

mysql 事务回滚日志 undo log 怎么实现原子性与回滚

MySQL 的 Undo Log 是实现事务原子性和回滚能力的核心机制,它通过记录数据修改前的旧值(即“反向操作”),让事务在失败或显式执行 ROLLBACK 时能安全地恢复到事务开始前的一致状态。

Undo Log 如何保障原子性

原子性要求事务中的所有操作要么全部成功,要么全部不生效。Undo Log 在事务执行过程中持续记录每一条变更的“前镜像”(before image):

  • INSERT 操作:记录新插入行的主键(或唯一标识),回滚时直接按主键删除该行;
  • UPDATE 操作:记录被修改字段的原始值(或整行旧值),回滚时用旧值覆盖当前值;
  • DELETE 操作:记录被删行的完整内容(包括主键和所有列),回滚时重新插入该行。

这些日志在事务提交前始终保留,确保即使系统崩溃,未提交事务的状态也可依据 Undo Log 撤销,从而满足原子性约束。

Undo Log 的物理存储与生命周期

在 InnoDB 中,Undo Log 并非写入独立文件,而是存放在 Undo Tablespace(可配置为独立文件或系统表空间的一部分)中,以段(segment)、区(extent)、页(page)组织:

Java Maven Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载
  • 每个事务从 Undo Log Segment 分配空间,按需追加日志页;
  • 事务提交后,对应 Undo Log 不会立即清除,而是标记为“可清理”,由后台线程(purge thread)根据 MVCC 可见性规则异步回收;
  • 只有当所有活跃事务(包括长事务)都不再需要该 Undo Log 版本时,它才会被真正释放。

回滚操作的具体执行流程

执行 ROLLBACK 或事务异常终止时,InnoDB 按照 Undo Log 中记录的逆序(LIFO)逐条应用反向操作:

  • 定位该事务对应的 Undo Log 链(通过事务 ID 和 rollback segment header 关联);
  • 从最新一条日志开始,读取类型(INSERT/UPDATE/DELETE)及原始数据;
  • 对聚簇索引和二级索引分别执行逆操作(例如 UPDATE 回滚需同时更新聚簇索引记录和涉及的二级索引项);
  • 释放事务持有的锁,并将事务状态置为已回滚。

整个过程在内存中完成,不依赖磁盘重放,因此回滚速度快,且不破坏其他事务的并发执行。

与 Redo Log 的协同关系

Undo Log 负责逻辑回退,Redo Log 负责物理重做——二者分工明确、缺一不可:

  • Redo Log 确保已提交事务的持久性(crash safe),记录“做了什么”;
  • Undo Log 支持未提交事务的回滚和 MVCC 多版本读,记录“原来是什么”;
  • 两者都写入磁盘,但 Redo Log 是顺序写、强制刷盘(受 innodb_flush_log_at_trx_commit 控制),Undo Log 则可缓冲写入,由 purge 机制批量管理。

这种设计使 MySQL 同时满足 ACID 中的原子性(A)、一致性(C)、隔离性(I)和持久性(D)。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2053

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1259

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

735

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2732

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4548

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1059

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

4811

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4302

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

5594

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习