From ed2324ccb2b4cb8a996545599c6cd3061b746828 Mon Sep 17 00:00:00 2001 From: asahi Date: Sat, 9 Aug 2025 17:01:52 +0800 Subject: [PATCH] =?UTF-8?q?doc:=20=E9=98=85=E8=AF=BBundo=20log=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mysql/mysql文档/mysql_事务.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/mysql/mysql文档/mysql_事务.md b/mysql/mysql文档/mysql_事务.md index 658be7b..3fee684 100644 --- a/mysql/mysql文档/mysql_事务.md +++ b/mysql/mysql文档/mysql_事务.md @@ -460,6 +460,28 @@ rollback segment header中包含了128个slot,每个slot包含4字节,并且 undo slot的数量会影响innodb数据库中的事务并行程度, +#### 内存组织方式 +innodb中针对undo log的内存数据奇结构如下: +7 + +##### undo::Tablespace +对于磁盘中的每个undo tablespace,都会在内存中维护一个`undo::Tablespace`结构,`undo::Tablespace`结构中,最重要的部分是`trx_rseg_t`。 + +##### trx_rseg_t +`trx_rseg_t`关联了rollback segment header。除了基础元数据之外,其还包含了四个`trx_undo_t`类型的链表: +- Update List: update list中包含`用于记录update undo record的undo segments` +- Update Cached:update cached list中包含可以被重用的update undo segments +- Insert List:insert list中包含了正在使用的insert undo segments +- Insert Cached:isnert cached list中包含了后续可以被重用的insert undo segments + +##### trx_undo_t +trx_undo_t关联的则是上面描述的undo segment。 + +#### undo writing +当一个写事务开启时,将会通过`trx_assign_rseg_durable`分配Rollback Segment,内存中的trx_t也会指向对应的trx_rseg_t内存结构。 + +rollback segment的分配策略很简单,会依次尝试下一个活跃的rollback segment。在此之后,如果事务内的第一条修改命令需要写undo record,将会调用`trx_undo_assign_undo`来获取undo segment。在获取undo segment时,`trx_rseg_t`中包含的cached list中节点将会被优先使用。sa + ### purge 表`t`中,`a`为聚簇索引,`b`为辅助索引,若执行如下sql ```sql