回滚日志 - Undo Log

  • 只适用于 InnoDB
  • 实现事务回滚, 或者崩溃时回滚(撤销)事务所作的修改, 保障了原子性
  • Undo Log + Read View 实现 MVCC
  • 会写到 Buffer Pool 中的 “undo页”, 通过 Redo Log 持久化

版本链

一条记录的每一次更新操作产生的 undo log 格式都有一个 roll_pointer 指针和一个 trx_id 事务id:

  • 通过 trx_id 可以知道该记录是被哪个事务修改的;
  • 通过 roll_pointer 指针可以将这些 undo log 串成一个链表,这个链表就被称为版本链;
  • 版本链头结点为记录数据, 在聚簇索引中; 其他节点为 undo log


Redo Log vs Undo Log

  • 都只适用于 InnoDB

  • Redo Log 记录事务修改后的数据状态, 记录的是更新后的值, 主要用于事务崩溃回复, 保证事务持久性

  • Undo Log 记录事务修改前的数据状态, 记录的是更新前的值, 主要用于事务回滚, 保证事务的原子性


  • 事务提交失败/事务执行错误, MySQL重启后通过 Undo Log 回滚事务

  • 事务提交后发生崩溃(宕机崩溃), 重启后通过 Redo Log 恢复事务

Link to original

See Also