1. undo log 存在的意义

用于事务回滚,比如一个事务里有 4个 增删改操作,结果目前为止已经执行了 2 个增删改SQL 了,已经更新了一些buffer pool 里的数据了,但是还有 2个增删改 SQL 的逻辑还没执行,此时如果需要回滚就需要借助 undo log 恢复被更新的数据。
比如执行了 INSERT 语句,那么undo log 必须告诉你插入数据的主键ID,在回滚的时候可以从缓存页里把这条数据删除。
如果执行了DELETE 语句,那么undo log 会记录下被删除的语句,回滚的时候就得重新插入一条数据。
如果执行了UPDATE语句,那么undo log 会记录下之前的数据,回滚的时候把数据更新回去。

2. undo log 格式

以INSERT 语句为例,它的undo log 类型是 TRX_UNDO_INSERT_REC,这个undo log 包含了以下一些东西:

  • 这条日志的开始位置
  • 主键的各列长度和值(联合主键,多个列)
  • 表id
  • undo log 日志编号 (从 0 开始依次递增)
  • undo log 日志类型(类似 TRX_UNDO_INSERT_REC)
  • 这条日志的结束位置

回滚时直接定位到对应表的和主键对应的缓存页,进行相应的修改。