知识卡片
两段式提交的两阶段流程与三大缺陷
内容
两段式提交(2PC)把[[XA全局事务的事务管理器与资源管理器分工]]中”依次提交 多个数据源易导致部分提交部分回滚”的问题,拆成准备(投票)和提交(执行) 两个阶段来解决。准备阶段:协调者问所有参与者能否提交,参与者把提交要做的 全部内容写进重做日志(唯独不写最后的Commit Record),回复Prepared或 Non-Prepared,此时仍持有锁维持隔离。提交阶段:若全员回复Prepared,协调者 先持久化自己的Commit状态,再让所有参与者执行提交(只需补一条Commit Record,很轻量);若有任何一方回复Non-Prepared或超时,协调者转为让所有 参与者执行回滚。2PC有三个显著缺陷:单点问题(协调者宕机时所有参与者只能 死等,因为参与者对协调者指令的等待无法设超时);性能问题(两次远程调用、 三次持久化,整体耗时取决于最慢的参与者);一致性风险(若协调者在自己 提交后、发出Commit指令前网络断开,会出现协调者数据已提交但参与者未提交 且无法回滚的不一致状态,这与”宕机最终能恢复”的FLP不可能原理背后的假设 密切相关)。
结构图:
sequenceDiagram
participant C as 协调者
participant P as 参与者们
C->>P: 准备阶段: 询问能否提交
P-->>C: Prepared(写重做日志但不写Commit Record)/ Non-Prepared
alt 全部Prepared
C->>C: 持久化自身Commit状态
C->>P: 提交阶段: 发送Commit指令
P-->>C: 补写Commit Record, 完成提交
else 任一Non-Prepared或超时
C->>P: 发送Abort指令
P-->>C: 根据回滚日志清理数据
end
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第3章"事务处理"3.2节
"全局事务"(源文件:_epub-src对应OEBPS/Text/chapter28.xhtml)
- 结论依据:原文详述准备阶段(写日志不写Commit Record)和提交阶段
(补Commit Record或触发回滚)的具体操作,并逐条列出单点问题、性能
问题、一致性风险三大缺陷及其成因,直接支撑本卡片结构梳理。
- 原始内容:以上这两个过程被称为"两段式提交"(2 Phase Commit,2PC)
协议……单点问题:一旦宕机的不是其中某个参与者,而是协调者的话,所有
参与者都会受到影响……性能问题……一致性风险:尽管提交阶段时间很短,
但这仍是一段明确存在的危险期。