gydtep
发表于 2022-11-17 07:28:41
方便之后Header中增加内容时的兼容;之后是一些Flag信息;Next Undo Log及Prev Undo Log标记前后两个Undo Log,这个会在接下来介绍;最后通过History List Node将自己挂载到为Purge准备的History List中。
gydtep
发表于 2022-11-17 08:09:18
索引中的同一个Record被不同事务修改,会产生不同的历史版本,这些历史版本又通过Rollptr穿成一个链表,供MVCC使用。如下图所示:
gydtep
发表于 2022-11-17 15:25:41
每个事务其实会修改一组的Record,对应的也就会产生一组Undo Record,这些Undo Record收尾相连就组成了这个事务的Undo Log。
gydtep
发表于 2022-11-17 15:48:06
除了一个个的Undo Record之外,还在开头增加了一个Undo Log Header来记录一些必要的控制信息,因此,一个Undo Log的结构如下所示:
gydtep
发表于 2022-11-18 07:39:17
这个就是这个Undo Segment中磁盘空间管理的Handle;其中记录的是这个Undo Segment的状态,比如TRX_UNDO_CACHED、TRX_UNDO_TO_PURGE等;这个Undo Segment中最后一条Undo Record的位置;
gydtep
发表于 2022-11-18 15:14:05
update类型除了记录主键以外还会有一个update fileds记录这个历史值跟索引值的diff。之后指向当前Undo Record位置的Rollptr会返回写入索引的Record上。
gydtep
发表于 2022-11-19 10:09:03
所谓历史版本就是假设在该只读事务开始的时候对整个DB打一个快照,之后该事务的所有读请求都从这个快照上获取。当然实现上不能真正去为每个事务打一个快照,这个时间空间都太高了。
gydtep
发表于 2022-11-20 07:09:40
Undo本身也有自己对应的Redo Log类型:MLOG_UNDO_INIT类型在Undo Page舒适化的时候记录初始化;在分配Undo Log的时候,需要重用Undo Log Header或需要创建新的Undo Log Header的时候,
gydtep
发表于 2022-11-20 07:32:09
除了通用的一些MLOG_2BYTES、MLOG_4BYTES类型之外,Undo本身也有自己对应的Redo Log类型:MLOG_UNDO_INIT类型在Undo Page舒适化的时候记录初始化;
gydtep
发表于 2022-11-21 13:02:21
除了通用的一些MLOG_2BYTES、MLOG_4BYTES类型之外,Undo本身也有自己对应的Redo Log类型:MLOG_UNDO_INIT类型在Undo Page舒适化的时候记录初始化;在分配Undo Log的时候