4. 分布式事务协议:2PC、3PC、TCC 与 Saga 模式

在分布式系统中,跨多个节点、多个服务的数据一致性是核心挑战。分布式事务协议通过协调参与者(Participant)与协调者(Coordinator)之间的交互,在可用性与一致性之间做出权衡。本章深入剖析四种主流协议:两阶段提交(2PC)、三阶段提交(3PC)、TCC 模式与 Saga 模式,并对比其适用场景与压测关注点。

4.1 两阶段提交(2PC)

2PC 是最经典的强一致性分布式事务协议,分为投票阶段(Voting Phase)和提交阶段(Commit Phase)。协调者向所有参与者发送 prepare 请求,参与者执行本地事务但不提交,返回 Yes/No;若全部返回 Yes,协调者发送 commit,否则发送 abort。

压测关注点:2PC 在投票阶段会锁定资源(如数据库行锁),高并发下锁等待时间急剧上升,容易导致事务超时和死锁。压测时需重点监控协调者单点瓶颈与参与者锁持有时间。
两阶段提交(2PC)时序流程 协调者 参与者1 参与者2 阶段1:投票 prepare prepare Yes Yes 阶段2:提交 commit commit ack ack 任一参与者返回 No 或超时 → 协调者发送 abort,所有参与者回滚
2PC 优缺点对比
维度说明
一致性强一致性,所有节点要么全部提交,要么全部回滚
可用性协调者为单点,宕机后参与者阻塞等待,系统不可用
性能同步阻塞,资源锁定时间长,高并发下吞吐量低
适用场景短事务、低并发、对一致性要求极高的场景(如银行转账)

4.2 三阶段提交(3PC)

3PC 在 2PC 基础上引入超时机制和预提交阶段(PreCommit),将投票阶段拆分为 CanCommit 和 PreCommit,降低阻塞范围。协调者超时后自动 abort,参与者超时后自动 commit(避免无限等待)。

压测提示:3PC 减少了阻塞时间,但引入了“参与者超时自动提交”的风险——若网络分区导致参与者误判,可能破坏一致性。压测时需注入网络延迟和分区故障,验证超时阈值设置是否合理。
三阶段提交(3PC)状态机 协调者 CanCommit PreCommit DoCommit 参与者 等待 CanCommit 预提交完成 提交/回滚 CanCommit? → Yes PreCommit → ACK DoCommit → 完成 参与者超时未收到 DoCommit → 自动提交(避免阻塞);协调者超时 → 自动 abort

4.3 TCC 模式

TCC(Try-Confirm-Cancel)是一种补偿型柔性事务模式,将每个服务操作拆分为三个阶段:Try(预留资源)、Confirm(确认执行)、Cancel(取消释放)。业务方需自行实现幂等和补偿逻辑。

  • Try:检查并预留业务资源(如冻结库存、锁定账户余额)。
  • Confirm:真正执行业务操作,使用 Try 阶段预留的资源。
  • Cancel:释放 Try 阶段预留的资源,回滚业务。
压测陷阱:TCC 的 Cancel 操作必须幂等且高效。压测时若 Cancel 逻辑存在 bug(如重复释放资源),会导致数据不一致。建议在压测脚本中模拟 Try 成功但 Confirm 超时的场景,验证 Cancel 的幂等性。
TCC 与 2PC 核心差异
维度2PCTCC
资源锁定数据库行锁/表锁,粒度粗业务预留,粒度细(如冻结字段)
一致性强一致性最终一致性
性能低(锁等待)高(无长锁)
业务侵入低(对业务透明)高(需实现 Try/Confirm/Cancel)
适用场景短事务、低并发长事务、高并发、跨服务

4.4 Saga 模式

Saga 模式将长事务拆分为一系列本地事务,每个本地事务对应一个补偿事务。Saga 有两种执行方式:Choreography(编排)和Orchestration(编排器)。任一本地事务失败,则按逆序依次触发补偿事务。

压测策略:Saga 的补偿链长度直接影响恢复时间。压测时需构造“第 N 步失败”的场景,测量补偿事务的完整执行时间与资源释放效率。对于编排模式,还需关注事件总线的消息积压。
Saga 编排模式(Choreography)流程 服务A(订单) 服务B(支付) 服务C(库存) 服务D(物流) 创建订单 扣款 减库存 补偿:释放库存 补偿:退款 补偿:取消订单 任一服务失败 → 触发前序服务的补偿事务(逆序执行),保证最终一致性

4.5 四种协议对比总结

2PC / 3PC / TCC / Saga 核心对比
协议一致性资源锁定阻塞业务侵入典型场景
2PC强一致性数据库锁同步阻塞低银行转账、账户扣款
3PC强一致性(有风险)数据库锁超时降级低对可用性有要求的强一致场景
TCC最终一致性业务预留无阻塞高高并发、跨服务、长事务
Saga最终一致性无锁无阻塞中微服务编排、事件驱动
压测选型建议:若压测目标为高吞吐、低延迟,优先选择 TCC 或 Saga;若压测目标为数据强一致性验证,选择 2PC 并重点测试协调者容错与锁超时。3PC 在实际生产中使用较少,压测时需特别关注超时参数对一致性的影响。