从最抽象的层面来看,两阶段提交(2PC) 是一种为了在多个独立组件之间达成“原子性操作”而设计的协作模式

它的核心逻辑可以超越数据库、超越网络,总结为一句话:“先试探,再决策。”

以下是不局限于任何具体场景的通用设计模式说明:

核心角色

  • 协调者 (Coordinator):负责收集信息、做最终决定并下达命令。
  • 参与者 (Participant):负责执行具体任务,并向协调者汇报状态。

两个阶段的通用逻辑

第一阶段:准备阶段 (The Voting Phase)

协调者询问所有参与者:“你现在能不能保证完成这个任务?”

  • 参与者
    1. 检查自己是否具备完成任务的条件。
    2. 锁定资源(确保在正式命令下来前,状态不会被别人改变)。
    3. 回复“可以”或“不行”。

第二阶段:执行阶段 (The Decision Phase)

协调者根据第一阶段的反馈做最终决定:

  • 如果所有人都能完成:下达“正式执行”命令。参与者完成任务并释放资源。
  • 如果有人不能完成(或没响应):下达“取消/回滚”命令。所有参与者放弃任务并释放资源,回到初始状态。

这种模式的本质特征

  • 原子性保证:它确保了一组操作要么“全做”,要么“全不做”,消除了中间状态。
  • 悲观锁定:为了保证成功,参与者在第一阶段之后必须锁定资源。这意味着它是一种牺牲并发性能来换取数据严谨性的设计。
  • 强依赖协调者:所有参与者都在等待协调者的最终指令,协调者是整个流程的“大脑”。