二阶段提交(Two-Phase Commit,2PC)是一种经典的分布式事务协议,用于保证分布式系统中多个节点的数据一致性。它将事务的提交过程分为两个阶段:准备阶段和提交阶段,由一个协调者(Coordinator)节点和多个参与者(Participant)节点共同完成。
1. 核心思想
在分布式系统中,当一个事务需要更新多个节点的数据时,二阶段提交确保所有节点要么全部成功提交事务,要么全部回滚,从而保证数据的一致性。
2. 两阶段流程
阶段一:准备阶段(Prepare Phase)
- 协调者向所有参与者发送事务准备请求(包含 SQL 语句)。
- 参与者执行事务操作(如写本地日志、执行 SQL),但暂不提交。
- 参与者向协调者返回响应:成功:表示事务可以提交(如本地执行无异常)。失败:表示事务需要回滚(如本地执行失败)。
阶段二:提交阶段(Commit Phase)
- 情况 1:所有参与者都返回成功协调者向所有参与者发送 ** 提交(Commit)** 指令。参与者执行提交操作,并释放事务持有的资源(如锁)。参与者向协调者返回确认(ACK)。协调者收到所有确认后,标记事务完成。
- 情况 2:任一参与者返回失败协调者向所有参与者发送 ** 回滚(Rollback)** 指令。参与者执行回滚操作,并释放资源。参与者向协调者返回确认(ACK)。协调者标记事务失败。
3. 优缺点
优点
- 强一致性:保证所有节点的数据最终一致。
- 实现简单:逻辑清晰,易于理解和实现。
缺点
- 单点故障:协调者是单点,若其崩溃,可能导致整个系统阻塞。
- 同步阻塞:所有参与者需等待协调者指令,性能较低。
- 数据不一致风险:若协调者在发送 Commit 后崩溃,部分参与者可能未收到指令,导致数据不一致。
4. 应用场景
- 数据库分布式事务:如 MySQL 的 XA 协议。
- 微服务分布式事务:跨服务的业务操作(如订单、库存、支付)。
5. 对比三阶段提交(3PC)
二阶段提交的改进版本是三阶段提交(3PC),通过引入预提交阶段和超时机制,减少了阻塞问题,但实现更复杂。
总结
二阶段提交是一种基础的分布式事务协议,通过两阶段的协调机制保证数据一致性,但存在性能和可用性问题,适用于对一致性要求高、并发度低的场景。现代分布式系统常采用更灵活的方案(如 TCC、Saga 模式)来平衡性能和一致性。