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 链表的末尾 。
文章插图
图片
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 链表的尾部 。
文章插图
图片
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 核心模块揭秘】
推荐阅读
- 创造与魔法搬家cd多久,创造与魔法家园核心成员怎么设置
- MySQL 核心模块揭秘,你看明白了吗?
- 东航坠机事故,你关心的十大核心问题是什么
- ie浏览器一直弹出修复工具,QQ浏览器怎么设置漏洞模块拦截
- 十八项核心制度闭环管理是什么意思 十八项核心制度闭环管理是什么意思呀
- 从 MySQL 到 ByteHouse,抖音精准推荐存储架构重构解读
- 功率模块自热阻和耦合热阻区别 功率模块自热阻和耦合热阻区别是什么
- 准线上事故之MySQL优化器索引选错
- 什么是网络中的路由器?核心功能解释
- MySQL数据恢复,你会吗?