二阶段提交
步骤如下
-
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里面则提交,不在则回滚。