具体细节 请去掘金购买《MySQL 是怎样运行的:从根儿上理解 MySQL》
通用链表结构(页通过这些pageNumebr和offset组成双端链表)
1.在写入undo日志的过程中会使用到多个链表。
2.在某个表空间内,我们可以通过一个页的页号和在页内的偏移量来唯一定位一个节点的位置
3.Pre Node Page Number和Pre Node Offset的组合就是指向前一个节点的指针
4.Next Node Page Number和Next Node Offset的组合就是指向后一个节点的指针。
基节点的结构
1.List Length表明该链表一共有多少节点。
2.First Node Page Number和First Node Offset的组合就是指向链表头节点的指针。
3.Last Node Page Number和Last Node Offset的组合就是指向链表尾节点的指针
FIL_PAGE_UNDO_LOG页面--专门用来存储undo日志
Undo Page Header
1.TRX_UNDO_PAGE_TYPE:本页面准备存储什么种类的undo日志
2.一个Undo页面的只能存储一种类型的undo日志,不能混合存储。
3.类型主要有TRX_UNDO_INSERT_REC和除了TRX_UNDO_INSERT_REC,比如TRX_UNDO_DEL_MARK_REC、TRX_UNDO_UPD_EXIST_REC啥的,一般由DELETE、UPDATE语句产生的undo日志属于这个大类。
4.其中TRX_UNDO_INSERT_REC是由insert语句产生,事务提交后可以删除。而其他的类型的则留作MVCC
5.TRX_UNDO_PAGE_START:表示第一条undo日志在本页面中的起始偏移量。
6.TRX_UNDO_PAGE_FREE:与上边的TRX_UNDO_PAGE_START对应,表示当前页面中存储的最后一条undo日志结束时的偏移量
7.TRX_UNDO_PAGE_NODE:代表一个List Node结构
Undo页面链表
单个事务中的Undo页面链表
1.一个事务中产生的undo日志占用的页面组成了链表,就是TRX_UNDO_PAGE_NODE
2.由于undo日志不能混合存储,因此很有可能产生两个页面链表,一个是insert,一个是update
3.此外规定对普通表和临时表的记录改动时产生的undo日志要分别记录
4.所以一个事务最多有4个以undo页面为节点组成的链表
5.当然,并不是在事务一开始就会为这个事务分配这4个链表,具体分配策略如下:
6.刚刚开启事务时,一个Undo页面链表也不分配。
7.当事务执行过程中向普通表中插入记录或者执行更新记录主键的操作之后,就会为其分配一个普通表的insert undo链表。
8.当事务执行过程中删除或者更新了普通表中的记录之后,就会为其分配一个普通表的update undo链表。
9.当事务执行过程中向临时表中插入记录或者执行更新记录主键的操作之后,就会为其分配一个临时表的insert undo链表。
10.当事务执行过程中删除或者更新了临时表中的记录之后,就会为其分配一个临时表的update undo链表。
多个事务中的Undo页面链表
1.多个事务和单个事务的链表没有区别
2.每个事务都生成自己的链表
undo日志具体写入过程
段(Segment)的概念
1.段是