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