“名称中的“两阶段”是同一事务的锁增长阶段与收缩阶段,不是两阶段提交的 prepare/decision 协调;两种协议既不互相实现,也不互相蕴含。严格 2PL 给出冲突可串行化和本页所述的严…”
形式陈述 ​
两阶段提交(2PC)协调一个分布式事务的原子决定。第一阶段,协调者发送 prepare,参与者在本地检查并把可恢复的 yes/预提交状态写入稳定日志后投票;若所有票为 yes,协调者记录并广播 commit,否则记录并广播 abort。第二阶段参与者按决定完成并确认。日志与恢复协议保证已作出的全局决定在崩溃后不反转。
直觉
prepare 阶段不是询问“现在愿不愿意”,而是要求参与者把撤销/重做信息与资源锁持久化到足以在崩溃恢复后兑现 yes。协调者只有收齐全部 yes 才能持久化 commit 决定,否则决定 abort;第二阶段传播唯一决定。阻塞来自信息不对称:已 prepared 的参与者在看不到协调者日志时,无法区分“commit 已决定但消息未到”与“尚未决定”。
例子与边界
若某参与者投 yes 后协调者崩溃,它不能自行判断全局是否已 commit,只能保持锁和预提交状态等待恢复或向其他节点询问,因此 2PC 是阻塞协议。网络分区中原子性仍可通过等待维持,但可用性下降。这种停顿来自全局决定信息暂时不可得,不必形成资源 wait-for graph 中的循环,不能未经模型分析就等同为经典资源死锁。2PC 协调的是 commit/abort,不能在异步崩溃模型中凭空获得非阻塞共识;3PC 也依赖更强时序假设。
参与者 PREPARED 并回复 yes 后,协调者可能写入 COMMIT 随即崩溃。
推论与应用
消息传递中的崩溃使 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。