https://www.51cto.com/article/696677.html

所谓两阶段提交,其实就是把 redo log 的写入拆分成了两个步骤:prepare 和 commit。

首先,存储引擎将执行更新好的新数据存到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务

然后执行器生成这个操作的 bin log,并把 bin log 写入磁盘

最后执行器调用存储引擎的提交事务,存储引擎把刚刚写入的 redo log 状态改为提交(commit)状态,更新完成

如果数据库在写入 redo log(prepare) 阶段之后、写入 binlog 之前,发生了崩溃:

此时 redo log 里面的事务处于 prepare 状态,binlog 还没写,之后从库进行同步的时候,无法执行这个操作,但是实际上主库已经完成了这个操作,所以为了主备一致,MySQL 崩溃时会在主库上回滚这个事务