undo日志

为了保证事务的原子性,设计InnoDB的大叔引入了undo日志,undo日志记载了回滚一个操作所需的必须内容。

在事务对表中的记录进行改动时,才会为这个事务分配一个唯一的事务id。事务id值时一个递增的数字。先被分配的id的事务得到的是较小的事务id,后被分配id的事务得到的是较大的事务id。未被分配事务id的默认为0.聚簇索引记录中有一个trx_id隐藏列,它代表对这个聚簇索引记录进行改动的语句所在的事务对应的事务id

不同的场景有不同类型的undo日志,比如TRX_UNDO_INSERT_RECRRX_UNDO_DEL_MARK_RECTRX_UNDO_UPD_EXIST_REC等。
类型FIL_PAGE_UNDO_LOG的页面是专门用来存储undo日志的,我们简称Undo页面。
在一个事务执行过程中,最多分配4个Undo页面链表,分别是:

  • 针对普通表的insert undo链表
  • 针对普通表的update undo链表
  • 针对临时表的insert undo链表
  • 针对临时表的update undo链表

只有真正用到这些链表的时候才会去创建它们

每个undo页面链表都对应一个Undo Log SegmentUndo页面链表的第一个页面中有一个名为Undo Log Segment Header的部分,专门用来存储关于这个段的一些信息。

同一个事务向一个Undo页面链表中写入undo日志算是一个组,每个组都以一个Undo Log Header部分开头。
一个Undo页面链表如果可以被重用,需要符合下面的条件;

  • 该链表中只包含一个Undo页面;
  • Undo页面已经使用的空间小于整个页面空间的3/4。

每个Rollback Segment Header页面都对应着一个回滚段,每个回滚段包含1024undo slot,一个undo slot代表一个Undo页面链表的第一个页面的页号,目前,InnoDB最多支持128个回滚段,其中第0号,第33-127号回滚段是针对普通表设计的,第1-32号回滚段是针对临时表设计的。

上一篇:andriod 获取时间控件


下一篇:JAVA异常设计原则