undo log
属于Innodb存储引擎的
实现了事务的原子性,主要用于事务回滚和MVCC
每当 InnoDB 引擎对一条记录进行操作(修改、删除、新增)时,要把回滚时需要的信息都记录到 undo log 里,比如:
● 在插入一条记录时,要把这条记录的主键值记下来,这样之后回滚时只需要把这个主键值对应的记录删掉就好了;
● 在删除一条记录时,要把这条记录中的内容都记下来,这样之后回滚时再把由这些内容组成的记录插入到表中就好了;
● 在更新一条记录时,要把被更新的列的旧值记下来,这样之后回滚时再把这些列更新为旧值就好了。
一条记录的每一次更新操作产生的 undo log 格式都有一个 roll_pointer 指针和一个 trx_id 事务id:
● 通过 trx_id 可以知道该记录是被哪个事务修改的;
● 通过 roll_pointer 指针可以将这些 undo log 串成一个链表,这个链表就被称为版本链;
很多人疑问 undo log 是如何刷盘(持久化到磁盘)的?
undo log 和 数据页的刷盘策略是一样的,都需要通过 redo log 保证持久化。
buffer pool 中有 undo 页,对 undo 页的修改也都会记录到 redo log。redo log 会每秒刷盘,提交事务时也会刷盘,数据页和 undo 页都是靠redo log机制保证持久化的。