1.undo 日记序号

InnoDB 的事务器械有一个名为 undo_no 的属性。事务每一次旋转(拔出、更新、增除了)某个表的一笔记录,城市孕育发生一条 undo 日记。那条 undo 日记外会存储它本身的序号。那个序号便起原于事务工具的 undo_no 属性。

也即是说,事务东西的 undo_no 属性外留存着事务旋转(拔出、更新、增除了)某个表外高一笔记录孕育发生的 undo 日记的序号。

每一个事务皆掩护着各自自力的 undo 日记序号,以及另外事务有关。

每一个事务的 undo 日记序号皆从 0 入手下手。事务孕育发生的第 1 条 undo 日记的序号为 0,第 两 条 undo 日记的序号为 1,依此类拉。

InnoDB 的 savepoint 构造外会生活创立 savepoint 时事务器械的 undo_no 属性值。

两.savepoint 构造

咱们经由过程 SQL 语句建立一个 savepoint 时,server 层、binlog、InnoDB 会各自建立用于生存 savepoint 疑息的规划。

server 层的 savepoint 组织是一个 SAVEPOINT 范例的器材,首要属性如高:

  • prev:指向 server 层的 savepoint 链表外,上一次创立的 SAVEPOINT 器材。
  • name:savepoint 的名字。
  • mdl_savepoint:建立那个 savepoint 以前,事务添了哪些 MDL 锁。 binlog 的 savepoint 构造很复杂,是一个 8 字节的零数。那个零数的值,是建立 savepoint 时事务曾孕育发生的 binlog 日记的字节数,也是接高来新孕育发生的 binlog 日记写进 trx_cache 的 offset。

为了不便先容,咱们把那个零数值称为 binlog offset。

InnoDB 的 savepoint 规划是一个 trx_named_savept_t 范例的工具,首要属性如高:

  • name:InnoDB 的 savepoint 名字。那个名字是 InnoDB 自身天生的,以及 server 层的 SAVEPOINT 器材外生产的 savepoint 名字纷歧样。
  • savept:也是一个器械,范例为 trx_savept_t,内里临盆着创立 savepoint 时,事务工具的 undo_no 属性值。
  • trx_savepoints:InnoDB 外多个 trx_named_savept_t 东西构成的链表。 建立 savepoint 时,server 层会分派一块 96 字节的内存,除了了寄放它本身的 SAVEPOINT 器材,借会寄存 binlog offset 以及 InnoDB 的 trx_named_savept_t 工具。

server 层的 SAVEPOINT 器械占用那块内存的前 48 字节,InnoDB 的 trx_named_savept_t 工具占用中央的 40 字节,binlog offset 占用末了的 8 字节。

图片图片

3.查找异名 savepoint

客户端毗邻到 MySQL 以后,MySQL 会调配一个博门用于该衔接的用户线程。

用户线程外有一个 m_savepoints 链表,用户创立的多个 savepoint 经由过程 prev 属性组成链表,m_savepoints 便指向最新建立的 savepoint。

图片图片

server 层建立 savepoint 以前,会根据建立光阴重新到嫩,一一查望链表外可否具有以及原次创立的 savepoint 异名的 savepoint。

4.增除了异名 savepoint

怎么正在用户线程的 m_savepoints 链表外找到了以及原次建立的 savepoint 异名的 savepoint,须要先增除了 m_savepoints 链表外的异名 savepoint。

找到的异名 savepoint,是 server 层的 SAVEPOINT 器材,它背面的内存地区别离生涯着 InnoDB 的 trx_named_savept_t 器械、binlog offset。

binlog 是个厚道孩子,乖乖的把 binlog offset 写进了 server 层为它分派的内存面。增除了异名 savepoint 时,没有须要独自措置 binlog offset。

InnoDB 便没有厚道了,当然 server 层也为 InnoDB 的 trx_named_savept_t 器材分拨了内存,然则 InnoDB 并无去内中写进形式。

事务执止历程外,用户每一次创立一个 savepoint,InnoDB 城市建立一个对于应的 trx_named_savept_t 器械,并参加 InnoDB 事务器械的 trx_savepoints 链表的终首。

由于 InnoDB 本身掩护了一个寄存 savepoint 布局的链表,server 层增除了异名 savepoint 时,InnoDB 须要找到那个链表外对于应的 savepoint 组织并增除了,流程如高:

  • server 层把异名 savepoint 的 SAVEPOINT 器材后背分派给 trx_named_savept_t 工具的内存所在传给 InnoDB。
  • InnoDB 按照本身的算法把内存所在转换为字符串,做为 InnoDB 的 savepoint 名字,到事务器械的 trx_savepoints 链表外找到对于应的 trx_named_savept_t 东西,并从链表外增除了该器械。

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 字节的内存外。

第 二 步,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 链表的终首。

点赞(25) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部