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号回滚段是针对临时表设计的。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值