MySQL 核心模块揭秘( 二 )

InnoDB 从事务对象的 trx_savepoints 链表中删除 trx_named_savept_t 对象之后,server 层接着从用户线程的 m_savepoints 链表中删除 server 层的 SAVEPOINT 对象,也就连带着清理了 binlog offset 。
5.保存 savepoint处理完查找、删除同名 savepoint 之后,server 层就正式开始创建 savepoint 了 , 这个过程分为 3 步 。
第 1 步,binlog 会生成一个 Query_log_event 。
以创建名为 test_savept 的 savepoint 为例 , 这个 event 的内容如下:
SAVEPOINT test_savept binlog event 写入 trx_cache 之后,binlog offset 会写入 server 层为它分配的 8 字节的内存中 。
第 2 步,InnoDB 创建 trx_named_savept_t 对象,并放入事务对象的 trx_savepoints 链表的末尾 。

MySQL 核心模块揭秘

文章插图
图片
trx_named_savept_t 对象的 name 属性值是 InnoDB 的 savepoint 名字 。这个名字是根据 server 层为 InnoDB 的 trx_named_savept_t 对象分配的内存的地址计算得到的 。
trx_named_savept_t 对象的 savept 属性,是一个 trx_savept_t 类型的对象 。这个对象里保存着创建 savepoint 时 , 事务对象中 undo_no 属性的值,也就是下一条 undo 日志的序号 。
第 3 步,把 server 层的 SAVEPOINT 对象加入用户线程的 m_savepoints 链表的尾部 。
MySQL 核心模块揭秘

文章插图
图片
6.总结server 层会创建一个 SAVEPOINT 对象 , 用于存放 savepoint 信息 。
binlog 会把 binlog offset 写入 server 层为它分配的一块 8 字节的内存里 。
InnoDB 会维护自己的 savepoint 链表,里面保存着 trx_named_savept_t 对象 。
如果 m_savepoints 链表中存在和本次创建的 savepoint 同名的 savepoint,创建新的 savepoint 之前,server 层会从链表中删除这个同名的 savepoint 。
server 层创建的 SAVEPOINT 对象会放入 m_savepoints 链表的末尾 。
InnoDB 创建的 trx_named_savept_t 对象会放入事务对象的 trx_savepoints 链表的末尾 。

【MySQL 核心模块揭秘】


推荐阅读