Skip to content

两阶段提交

Two-phase commit · 2PC

协调者先收集准备结果再统一决定提交或中止的原子提交协议。

条目类型
模型

形式陈述

两阶段提交(2PC)协调一个分布式事务的原子决定。第一阶段,协调者发送 prepare,参与者在本地检查并把可恢复的 yes/预提交状态写入稳定日志后投票;若所有票为 yes,协调者记录并广播 commit,否则记录并广播 abort。第二阶段参与者按决定完成并确认。日志与恢复协议保证已作出的全局决定在崩溃后不反转。

直觉

prepare 阶段不是询问“现在愿不愿意”,而是要求参与者把撤销/重做信息与资源锁持久化到足以在崩溃恢复后兑现 yes。协调者只有收齐全部 yes 才能持久化 commit 决定,否则决定 abort;第二阶段传播唯一决定。阻塞来自信息不对称:已 prepared 的参与者在看不到协调者日志时,无法区分“commit 已决定但消息未到”与“尚未决定”。

2PC:提交与阻塞
例子与边界

若某参与者投 yes 后协调者崩溃,它不能自行判断全局是否已 commit,只能保持锁和预提交状态等待恢复或向其他节点询问,因此 2PC 是阻塞协议。网络分区中原子性仍可通过等待维持,但可用性下降。这种停顿来自全局决定信息暂时不可得,不必形成资源 wait-for graph 中的循环,不能未经模型分析就等同为经典资源死锁。2PC 协调的是 commit/abort,不能在异步崩溃模型中凭空获得非阻塞共识;3PC 也依赖更强时序假设。

参与者 P 写入 PREPARED 并回复 yes 后,协调者可能写入 COMMIT 随即崩溃。P 若自行 abort,会与恢复后读到 commit 的其他参与者冲突;若自行 commit,也可能在协调者其实未收齐 yes 时错误。因此它只能查询决定或等待恢复。只靠超时选择 abort 会提高可用性却破坏原子性,除非系统使用另有证明的共识/租约机制。

推论与应用

消息传递中的崩溃使 2PC 依赖 write-ahead log、幂等消息、超时与人工或启发式恢复。它协调数据库分片、消息系统和其他跨资源事务的 commit/abort,但不提供事务隔离MVCC决定版本可见性,快照隔离规定读视图和并发写冲突,两者都与原子提交正交。

为消除单协调者阻塞,可把决定复制到共识组,而这实际上增加了更强协议,并非只调整 2PC 的超时参数。

参考资料
  • Philip A. Bernstein, Vassos Hadzilacos, and Nathan Goodman, Concurrency Control and Recovery in Database Systems, Addison-Wesley, 1987,Ch. 7, distributed commit protocols and recovery。
  • Jim Gray and Andreas Reuter, Transaction Processing: Concepts and Techniques, Morgan Kaufmann, 1992,Chs. 13–15, two-phase commit and transaction recovery。
关系图谱6 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系