基础理论

CAP 补充解释

单机数据库的事务满足ACID原则.

在分布式系统里,P 通常是必须面对的现实,因此实际常见取舍是:

CAP 三圆相交示意图

BASE 补充解释

可以把 BASE 理解为对 ACID 的工程化权衡:

常见讨论

CAP 可以证明吗?

可以。CAP 在形式化模型下是可证明的“不可能性结论”:在异步网络且可能发生网络分区时,系统无法同时严格满足强一致(C)与强可用(A)。

更准确地说:发生分区时,必须在 C 和 A 之间取舍。

BASE 是不是对 C 和 A 都做了妥协?

是。BASE 同时对两者做工程化降级:

如果追求强可用会怎样?

在分区场景下通常走向 AP:

2PC 是不是强一致?

是,2PC 的目标是保证原子提交(要么都提交,要么都回滚),属于提交层面的强一致;但代价是可用性下降,故障时可能阻塞并长期占用资源。

CP / AP 代表性方案与 CAP 落地

CP(优先一致性 + 分区容忍)

常见理论与产品:

它们利用 CAP 的方式:

AP(优先可用性 + 分区容忍)

常见产品与路线:

它们利用 CAP 的方式:


2PC(两阶段提交)

两阶段提交(Two-Phase Commit, 2PC)是一种经典的分布式事务协议,用于确保多个分布式系统中的操作要么全部成功,要么全部失败,保证数据一致性。

流程

  1. 准备阶段(Prepare Phase)
    协调者(Coordinator)向所有参与者(Participant)发送准备提交请求(prepare)。
    参与者执行本地事务操作,但不提交,只写入预提交日志,并锁定相关资源。
    参与者将执行结果(可以提交/不能提交)反馈给协调者。

  2. 提交阶段(Commit Phase)

    • 如果所有参与者都反馈“可以提交”,协调者向所有参与者发送提交(commit)请求,参与者正式提交本地事务,释放资源。
    • 如果有任何一个参与者反馈“不能提交”或超时未响应,协调者向所有参与者发送回滚(rollback)请求,参与者回滚本地事务,释放资源。
flowchart TD A[事务发起者发起TCC事务] --> B{各参与者Try阶段
预留资源} B -- 所有Try成功 --> C[各参与者Confirm阶段
正式提交] C --> D[事务完成] B -- 有Try失败或超时 --> E[各参与者Cancel阶段
释放资源/回滚] E --> D

优缺点

2PC 常用于分布式数据库、消息队列等场景。实际生产环境中,通常会用 TCC、SAGA 等更灵活的方案来替代 2PC。


3PC(三阶段提交)

三阶段提交(Three-Phase Commit, 3PC)是在 2PC 基础上改进的一种分布式事务协议,主要目的是减少协调者单点故障导致的阻塞和脑裂风险。3PC 将提交过程分为三个阶段:

  1. CanCommit 阶段(询问阶段)
    协调者向所有参与者发送“是否可以提交”请求(canCommit)。
    参与者收到后判断自己是否可以执行事务,并反馈“可以”或“不可以”。

  2. PreCommit 阶段(预提交阶段)
    如果所有参与者都同意可以提交,协调者发送“预提交”请求(preCommit)。
    参与者收到后执行事务操作并写入预提交日志,但还未正式提交,并反馈“已预提交”。
    此时参与者可以安全地提交事务,但如果出现故障也可以回滚。

  3. DoCommit 阶段(正式提交阶段)
    协调者收到所有参与者的“已预提交”反馈后,发送“正式提交”请求(doCommit)。
    参与者收到后正式提交事务并释放资源。

3PC 的改进点


TCC(Try-Confirm-Cancel)

角色

主要流程

  1. Try(尝试)阶段
    检查业务操作是否可以执行,预留资源,但不做最终提交。
    例如:冻结账户余额、锁定库存等。

  2. Confirm(确认)阶段
    真正执行业务操作,完成资源的正式提交。
    该阶段应保证幂等性(多次执行结果一致)。

  3. Cancel(取消)阶段
    如果任意参与方失败或超时,执行回滚操作,释放 Try 阶段预留的资源。
    该阶段也需保证幂等性。

TCC 适用于业务可以拆分为“预留-确认-取消”三步的场景,常见于金融、订单等系统。

TCC 与 2PC 的区别

常见改进方向

最后一个参与方提交事务的改进方案


参考:实际生产环境中,分布式事务方案需结合业务需求、系统架构和性能要求综合选型和优化。