gydtep 发表于 2022-11-15 18:50:29
要Purge的Undo Log横跨两个Undo Page,Undo Record 1在Page 1中,而Undo Record 2,3在Page 2中。如下图所示,首先会从当前的Undo Log Header中找到第一个Undo Record的位置Log Start Offset,gydtep 发表于 2022-11-16 09:09:14
在设计数据库时,我们假设数据库可能在任何时刻,由于如硬件故障,软件Bug,运维操作等原因突然崩溃。这个时候尚未完成提交的事务可能已经有部分数据写入了磁盘,如果不加处理gydtep 发表于 2022-11-17 12:14:32
其实只是修改对应Record的Delete Mark标记。对应的,如果这时这个Record又重新插入,其实也只是修改一下Delete Mark标记,也就是将这两种情况的delete和insert转变成了update操作。gydtep 发表于 2022-11-17 17:59:26
那么如何用固定的块大小承载不定长的Undo Log,以实现高效的空间分配、复用,避免空间浪费。InnoDB的基本思路是让多个较小的Undo Log紧凑存在一个Undo Page中gydtep 发表于 2022-11-18 07:38:57
当前Page还空闲部分的开头,也就是下一条Undo Record要写入的位置。Undo Segment中的第一个Undo Page还会在56字节到86字节记录Undo Segment Headergydtep 发表于 2022-11-18 14:09:44
当写事务开始时,会先通过trx_assign_rseg_durable分配一个Rollback Segment,该事务的内存结构trx_t也会通过rsegs指针指向对应的trx_rseg_t内存结构,gydtep 发表于 2022-11-18 18:36:08
TRX_UNDO_TO_PURGE或TRX_UNDO_CACHED,这个修改其实就是InnoDB的事务结束的标志,无论是Rollback还是Commit,在这个修改对应的Redo落盘之后,就可以返回用户结果,并且Crash Recovery之后也不会再做回滚处理。gydtep 发表于 2022-11-19 15:12:04
通过这个ReadView我们可以知道在这一瞬间,哪些事务已经提交哪些还在运行,根据Read Committed的要求,未提交的事务的修改就是不应该被看见的,对应地,已经提交的事务的修改应该被看到。gydtep 发表于 2022-11-20 13:30:43
对应每个磁盘Undo Tablespace会有一个undo::Tablespace的内存结构,其中最主要的就是一组trx_rseg_t的集合,trx_rseg_t对应的就是上面介绍过的一个Rollback Segment Header,gydtep 发表于 2022-11-21 13:02:07
也从上面的组织结构中可以看出来,Undo本身有着比Redo Log复杂得多、按事务分配而不是顺序写入的组织结构,其本身的Durability像InnoDB中其他的数据一样,需要靠Redo来保证,像庖丁解InnoDB之REDO LOG中介绍的那样。