什么是 2PC

二阶段提交(Two-Phase Commit, 2PC)是一种的分布式事务协议,用于确保分布式系统中多个节点的事务能够同时提交或回滚,以维持数据的一致性。

2PC 协议分为两个主要阶段。

1. 准备阶段(Prepare Phase)

  1. 协调者Coordinator)向所有参与者Participants)发送准备(Prepare)请求,询问它们是否准备好提交事务。每个参与者在接收到准备请求后,会执行以下操作:
    • 锁定资源:确保事务中涉及的资源(如数据库记录)被锁定,防止其他事务修改。
    • 预检查:进行必要的检查(如验证事务是否符合所有业务规则和约束条件)。
    • 如果一切正常,参与者会向协调者回复一个Yes(同意提交)的响应,同时记录自己的状态为“已准备好提交”。如果遇到问题,则回复No(拒绝提交)。

2. 提交阶段(Commit Phase)

  1. 基于回复决策:协调者收集所有参与者的响应。

    • 如果所有参与者都回复了 Yes,协调者会向所有参与者发送提交(Commit) 命令,指示它们正式提交事务,解锁资源,并对外部可见地更新状态。
    • 如果有任何参与者回复了 No,或者在等待超时后仍有参与者未响应,协调者会发送回滚(Rollback) 命令,指示所有参与者撤销之前的操作,释放资源锁定,保持数据一致性。
  2. 参与者响应:收到提交命令的参与者会完成事务并释放资源;收到回滚命令的参与者会撤销事务中的所有操作,同样释放资源。

2PC 假设所有节点都采用预写式日志(Write-Ahead Logging) 来写数据,且日志写入后不会丢失。WAL 的核心思想就是先写日志,再写数据。

2PC 的优缺点

优点

  • 强一致性,因为一阶段预留了资源,所有只要节点或者网络最终恢复正常,协议就能保证二阶段执行成功。
  • 业界标准支持,二阶段协议在业界有标准规范—— XA 协议,许多数据库和框架都有针对 XA 协议的分布式事务实现。

缺点

  • 在提交请求阶段,需要预留资源,在资源预留期间,其他人不能操作(比如,XA 在第一阶段会将相关资源锁定) ,会造成分布式系统吞吐量大幅下降
  • 容错能力较差,比如在节点宕机或者超时的情况下,无法确定流程的状态,只能不断重试,同时这也会导致事务在访问共享资源时发生冲突和死锁的概率增高。随着数据库节点的增多,这种趋势会越来越严重,从而成为系统在数据库层面上水平伸缩的“枷锁”。

总结

因此,二阶段提交通常适用于参与者较少、对数据一致性要求极高的场景。在现代分布式系统设计中,更多采用 BASE 理论 指导下的弱一致性模型,或使用更为先进的分布式一致性协议,如 PaxosRaft 等。