Innodb Undo Record Insert Update
赵明寰 https://whoiami.github.io/
0, Basic
本文主要介绍Undo Segment 的申请流程,以及后续的Insert Undo Record 和Update Undo Record 的写入流程。Innnodb 内部对于Undo Record 分为 Insert 类型和Update 类型, 对于Delete 操作是包含在Update 类型当中的。Undo Record 的格式由于历史原因修改的版本比较多,看起来比较繁琐,这里基于8.0.27统一整理Undo Insert Update Record 格式,方便更好理解Undo的内部逻辑。
1, Undo Segment 的内存结构
每个事务内部会有trx_rsegs_t 这样一个结构来存放分配的rollback segment 和分配的undo segments。
trx_rsegs_t 内部给了两个结构,trx_undo_ptr_t m_redo是为非临时表提供的指针。trx_undo_ptr_t m_noredo 是临时表提供的指针。
trx_undo_ptr_t 内部是rollback segment 和undo segments 指针。如果一个事物既有insert 操作,又有update 操作,那么其内部会被分配两个undo segment, 分别存放insert undo record 和update undo record。这样操作主要是为了后续清理undo record方便。
struct trx_t {
...
trx_rsegs_t rsegs; /* rollback segments for undo logging */
}
/** Rollback segments assigned to a transaction for undo logging. */
struct trx_rsegs_t {
/** undo log ptr holding reference to a rollback segment that resides in
system/undo tablespace used for undo logging of tables that needs
to be recovered on crash. */
trx_undo_ptr_t m_redo;
/** undo log ptr holding reference to a rollback segment that resides in
temp tablespace used for undo logging of tables that doesn't need
to be recovered on crash. (临时表分配)*/
trx_undo_ptr_t m_noredo;
};
/**Represents an instance of rollback segment along with its state variables.*/
struct trx_undo_ptr_t {
trx_rseg_t *rseg; /*!< rollback segment assigned to the
transaction, or NULL if not assigned
yet */
trx_undo_t *insert_undo; /*!< pointer to the insert undo log, or
NULL if no inserts performed yet */
trx_undo_t *update_undo; /*!< pointer to the update undo log, or
NULL if no update performed yet */
};