知识卡片

内部XA两阶段提交保证双日志一致

普通读书笔记卡

内容

事务提交要同时写Redo Log(InnoDB层)和Binlog(MySQL层,用于主从复制),如何保证两者同时成功或失败?MySQL用两阶段提交:阶段一InnoDB写好Redo/Undo Log进入Prepare状态,Binlog写入内存等待刷盘;阶段二收到Commit指令先刷盘Binlog,再让InnoDB真正Commit。恢复时以Binlog是否写入成功为唯一真相源判断补Commit或回滚。

参考来源

- 位置:第6章《数据库》6.7.2节「内部XA-Binlog与Redo Log一致性问题」(源文件:_epub-src/text/part0033.html) - 结论依据:原文明确说明内部XA用经典2PC方案:阶段1 InnoDB Prepare(Redo/Undo Log全部写入,Binlog写入内存等待刷盘),阶段2收到Commit指令先刷盘Binlog再让InnoDB Commit,恢复时以Binlog为准让Redo Log向Binlog靠齐,直接支持卡片论述。 - 原始内容:"阶段1:InnoDB的Prepare,是在把事务提交之前,对应的Redo Log和Undo Log全部都写入了。Binlog也已经写入到内存,只等刷盘。阶段2:收到客户端的Commit指令,先刷盘Binlog,然后让InnoDB执行Commit……整个过程以Binlog的刷盘来判定一个事务是否被成功提交。"