MySQL的XID-XID的作用

时间:2024-04-16 07:25:30

二阶段提交

步骤如下

  • InnoDB 进入 Prepare 阶段,并且 write/sync redo log,写 redo log,将事务的 xid 写入到 redo 日志中,binlog 不作任何操作

  • 进行 write/sync binlog,写 binlog 日志,也会把 xid 写入到 binlog

  • 调用 InnoDB 引擎的 commit 完成事务的提交,将 commit 信息写入到 redo 日志中

MySQL崩溃恢复会有什么操作

如果 redo log 里面的事务是完整的,也就是已经有了 commit 标识,则直接提交;

如果 redo log 里面的事务只有完整的 prepare,则判断对应的事务 binlog 是否存在并完整:

a. 如果是,则提交事务;

b. 否则,回滚事务。

MySQL 怎么知道 binlog 是完整的

一个事务的 binlog 是有完整格式的:statement 格式的 binlog,最后会有 COMMIT;

row 格式的 binlog,最后会有一个 XID event。

崩溃恢复的时候,会按顺序扫描 redo log:

如果碰到既有 prepare、又有 commit 的 redo log,就直接提交;

如果碰到只有 parepare、而没有 commit 的 redo log,就拿着 XID 去 binlog 找对应的事务。

MySQL解释如下

扫描最后一个binlog获取XID生成一个hash table,再扫描redo将checkpoint之后所有XID,如果XID在hash table里面则提交,不在则回滚。