https://blog.csdn.net/Weixiaohuai/article/details/117867353
在更新数据之前,MySQL会提前生成undo log日志,当事务提交的时候,并不会立即删除undo log,因为后面可能需要进行回滚操作,要执行回滚(rollback)操作时,从缓存中读取数据。undo log日志的删除是通过通过后台purge线程进行回收处理的。
同样,通过一张图来理解undo log的工作原理。

如上图:
- 1、事务 A 执行 update 操作,此时事务还没提交,会将数据进行备份到对应的 undo buffer,然后由 undo buffer 持久化到磁盘中的 undo log 文件中,此时 undo log 保存了未提交之前的操作日志,接着将操作的数据,也就是 Teacher 表的数据持久化保存到 InnoDB 的数据文件 IBD。
- 2、此时事务 B 进行查询操作,直接从 undo buffer 缓存中进行读取,这时事务 A 还没提交事务,如果要回滚(rollback)事务,是不读磁盘的,先直接从 undo buffer 缓存读取。
用 undo log 实现原子性和持久性的事务的简化过程:
假设有 A、B 两个数据,值分别为 1,2。
- A 事务开始
- B 记录 A=1 到 undo log 中
- C 修改 A = 3
- D 记录 B = 2 到 undo log 中