← 每日面试题 学习看板

什么是事务的2阶段提交?

面试题/03数据库中间件/01MySQL/01数据库基础概念与核心特性/什么是事务的2阶段提交?.md

面试记录 2026-09-17

题目:什么是事务的 2 阶段提交?

难度:low

标签:db/mysql/concepts, mysql/transaction, difficulty/low

评分:⭐⭐☆☆(2/5)

我的回答

两阶段提交在不同的情况下有不同的含义。分布式事务里边跟 MySQL 是不一样的。MySQL 这两阶段提交是先写日志,把内容写到日志,再批量提交到写磁盘,这样实现两阶段提交。然后分布式事务下是 RPC,它是通过先确认各自的准备情况,都准备好了,然后各自再统一进行提交,没有能提交的话就回滚。

点评

优点:

不足:

补充:

完整讲解

第一部分:知识重点剖析

核心考点定位:理解 2PC 在两个不同层级的实现:分布式事务协议(跨系统)与 MySQL 内部 2PC(跨日志系统),并能对比两者差异。

知识点拆解:

  1. 2PC 是什么(通用定义):Two-Phase Commit,两阶段提交协议,是一种分布式事务协调协议,让多个参与者对"提交还是回滚"达成一致。
  1. MySQL 内部的 2PC(重点是这个):
  1. Phase 1:Prepare
  1. Phase 2:Commit
redo 状态binlog 状态处理
prepare未写回滚(binlog 没写就不算提交)
prepare已写提交(binlog 已刷盘视为成功)
commit已写已完成,正常重放
无 redo-事务从未开始,忽略
  1. 分布式事务的 2PC(协议层):
  1. 分布式 2PC 的缺陷:
  1. MySQL 2PC 与分布式 2PC 的关键区别:
  1. 组提交 ≠ 2PC:
  1. 实际应用:

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. MySQL 关闭 binlog 时,2PC 还起作用吗?
  1. 分布式 2PC 为什么在业务系统里很少用?
  1. MySQL 的 XA START / XA END / XA COMMIT 是干什么的?

第三部分:面试者参考回答(口语化)

面试官您好,两阶段提交在不同场景下含义不同,我分两种讲。

第一种,MySQL 内部的 2PC,核心目的是保证 InnoDB 的 redo log 与 MySQL Server 的 binlog 数据一致。因为事务提交必须同时更新这两份日志,如果只更新一个就提交,数据会不一致——比如 redo 已经改了但 binlog 没写,主库崩了从库就少数据。

流程是这样:

崩溃恢复时怎么判断:看 redo 和 binlog 的状态。redo 是 prepare 但 binlog 没写,说明事务没成功,回滚;redo 是 prepare 但 binlog 已写,说明事务该成功了,提交;redo 是 commit 且 binlog 已写,正常重放。核心不变量是binlog 是提交成功的标志,binlog 没写就不 commit。

第二种,分布式事务的 2PC,是通用的分布式协调协议。

分布式 2PC 有严重缺陷:协调者单点故障(挂了参与者阻塞)、阻塞式协议(网络抖动就卡住)、数据不一致窗口(Prepare 到 Commit 之间状态不同步)。所以现代业务系统很少直接用原生 2PC,改用 TCC(Try-Confirm-Cancel)、Saga(长事务拆步骤)、Seata AT(无侵入自动补偿)等柔性事务方案。

两种 2PC 的区别:MySQL 2PC 的协调者是内部逻辑,参与者是 redo log 和 binlog,没有网络通信;分布式 2PC 的协调者是独立进程,参与者是多个数据库或服务,强依赖网络。组提交(Q8 那个)跟 2PC 是不同的东西,组提交是性能优化,2PC 是数据一致性。