gydtep 发表于 2022-11-14 11:28:24

TRX_UNDO_INSERT_REC类型的Undo回滚在row_undo_ins中进行,insert的逆向操作当然就是delete,根据从Undo Record中解析出来的主键

gydtep 发表于 2022-11-14 18:18:55

我们已经知道,InnoDB在Undo Log中保存了多份历史版本来实现MVCC,当某个历史版本已经确认不会被任何现有的和未来的事务看到的时候,就应该被清理掉。

gydtep 发表于 2022-11-14 19:01:04

因此就需要有办法判断哪些Undo Log不会再被看到。InnoDB中每个写事务结束时都会拿一个递增的编号trx_no作为事务的提交序号,

gydtep 发表于 2022-11-14 20:45:19

如下图所所以,由于ReadView List中最老的ReadView在获取时,Transaction J就已经Commit,因此所有的读事务都一定能被Index中的版本或者第一个Undo历史版本满足,不需要更老的Undo,因此整个Transaction J的Undo Log都可以清理了。

gydtep 发表于 2022-11-15 10:17:45

之后该事务的所有读请求都从这个快照上获取。当然实现上不能真正去为每个事务打一个快照,这个时间空间都太高了。InnoDB的做法,

gydtep 发表于 2022-11-15 18:50:40

处理完Undo Record1之后沿着Next Record Offset去找下一个Undo Record,当找到Page末尾时,要通过Page List Node找下一个Page,找到Page内的第一个Undo Record,重复上面的过程直到找出所有的Undo Record。

gydtep 发表于 2022-11-15 20:11:16

处理完Undo Record1之后沿着Next Record Offset去找下一个Undo Record,当找到Page末尾时,要通过Page List Node找下一个Page,找到Page内的第一个Undo Record,重复上面的过程直到找出所有的Undo Record。

gydtep 发表于 2022-11-15 20:40:39

并作为一种特殊的Update操作记录了Undo Record。那么在对应的TRX_UNDO_DEL_MARK_REC类型的Undo Record被清理之前,需要先从索引上真正地删除这个Delete Mark的记录。因此Undo Record的清理工作会分为两个过程:

gydtep 发表于 2022-11-16 14:44:06

会写自己对应的Redo Log,通过Redo Log来保证自己的原子性。因此,更合适的称呼应该是Undo Data。

三 Undo Record中的内容

gydtep 发表于 2022-11-16 15:09:32

每当InnoDB中需要修改某个Record时,都会将其历史版本写入一个Undo Log中,对应的Undo Record是Update类型。当插入新的Record时,
页: 515 516 517 518 519 520 521 522 523 524 [525] 526 527 528 529 530 531 532 533 534
查看完整版本: 免费领取阿里云服务器2000元代金券!