分布式事务核心概念

分布式事务是微服务与分布式系统中最具挑战的领域之一。本章从理论基石出发,逐步深入到主流实现模式,帮助你在架构选型时做出理性决策。

3.1 CAP 定理:分布式系统的“不可能三角”

CAP 定理由 Eric Brewer 于 2000 年提出,是分布式系统设计的根本约束。它指出一个分布式系统最多只能同时满足以下三个特性中的两个:

特性 全称 说明
C Consistency(一致性) 所有节点在同一时刻看到相同的数据
A Availability(可用性) 每个请求都能获得非错误的响应
P Partition Tolerance(分区容错性) 系统在网络分区时仍能正常运行
关键认知:在分布式系统中,网络分区是必然发生的,因此 P 是必选项。实际决策是在 CP 与 AP 之间做权衡。
CAP 定理三角模型 C 一致性 A 可用性 P 分区容错 CP(银行、ZooKeeper) AP(DNS、Cassandra) CA(单机关系型数据库) 实际分布式系统必须选择 CP 或 AP,CA 只在单机或无分区时成立

3.2 BASE 理论:对 CAP 的务实妥协

BASE 理论由 eBay 架构师 Dan Pritchett 提出,是对 CAP 中 AP 路线的实践总结。它放弃了强一致性,追求最终一致性:

  • BA — Basically Available(基本可用):系统允许部分功能降级,但核心服务保持可用
  • S — Soft State(软状态):允许数据存在中间状态,不要求时刻一致
  • E — Eventually Consistent(最终一致):经过一定时间后,所有副本数据最终达成一致
BASE vs ACID:ACID 是单机事务的黄金标准,BASE 是分布式环境下对可用性与扩展性的妥协。BASE 不保证实时一致,但保证“最终会一致”。

3.3 2PC / 3PC:传统分布式事务协议

3.3.1 两阶段提交(2PC)

2PC 引入协调者(Coordinator)角色,将事务提交分为两个阶段:

阶段 动作 参与者状态
阶段一:准备 协调者向所有参与者发送 prepare 请求,参与者执行事务但不提交,返回 Yes/No 就绪 / 中止
阶段二:提交/回滚 若全部返回 Yes,协调者发送 commit;否则发送 rollback 提交 / 回滚
2PC 痛点:同步阻塞(参与者等待协调者指令期间锁定资源)、单点故障(协调者宕机导致事务悬空)、脑裂风险(网络分区时参与者无法确定协调者意图)。

3.3.2 三阶段提交(3PC)

3PC 在 2PC 基础上引入超时机制和中间阶段,降低阻塞范围:

  1. CanCommit(询问阶段):协调者询问参与者是否具备提交条件,参与者返回可行性
  2. PreCommit(预提交阶段):协调者发送预提交指令,参与者执行事务但不提交
  3. DoCommit(提交阶段):协调者发送最终提交或中止指令
3PC 改进:参与者引入超时机制,在等待协调者指令超时后自动中止事务,避免 2PC 的无限阻塞问题。但 3PC 仍无法完全解决网络分区下的数据一致性问题。
2PC 两阶段提交流程 协调者 参与者 A 参与者 B prepare Yes prepare Yes commit commit 阶段二:提交 阶段一:准备 2PC 的同步阻塞问题:参与者在 prepare 后锁定资源, 必须等待协调者的 commit/rollback 指令才能释放

3.4 TCC 模式:业务补偿型分布式事务

TCC(Try-Confirm-Cancel)是一种业务层面的分布式事务方案,将每个服务操作拆分为三个阶段:

阶段 操作 示例(订单+库存)
Try 预留资源,检查业务条件 冻结库存数量,创建订单待支付状态
Confirm 确认执行,完成业务操作 扣减冻结库存,订单状态改为已支付
Cancel 取消操作,释放预留资源 释放冻结库存,订单状态改为已取消
TCC 优势:无全局锁、性能高、适合高并发场景。
TCC 挑战:业务侵入性强,每个服务需实现 Try/Confirm/Cancel 三个接口;Cancel 操作必须能正确回滚 Try 阶段的操作。

3.5 Saga 模式:长事务的最终一致方案

Saga 模式将一个大事务拆分为多个本地事务,每个本地事务都有对应的补偿事务。Saga 有两种执行方式:

3.5.1 编排式 Saga(Choreography)

  • 每个服务完成本地事务后,发布事件触发下一个服务
  • 任一服务失败,通过事件触发补偿流程
  • 适合服务数量少、流程简单的场景

3.5.2 协调式 Saga(Orchestration)

  • 引入 Saga 协调器(Orchestrator)统一管理流程
  • 协调器向各服务发送指令,并跟踪执行状态
  • 适合服务数量多、流程复杂的场景
Saga 协调式模式流程 Saga 协调器 订单服务 库存服务 支付服务 1. 创建订单 2. 扣减库存 3. 发起支付 补偿 补偿 补偿 任一服务失败时,协调器按逆序触发补偿事务, 保证数据最终一致性

3.6 模式对比与选型建议

模式 一致性 性能 业务侵入 适用场景
2PC 强一致 低(同步阻塞) 低 传统数据库、短事务、低并发
3PC 强一致(弱于2PC) 中 低 对可用性有要求的传统场景
TCC 最终一致 高 高 高并发、资源预留型业务(库存、账户)
Saga 最终一致 高 中 长事务、跨服务流程(订单、旅行预订)
选型建议:金融、支付等强一致场景优先考虑 2PC 或 TCC;互联网高并发、长流程场景优先考虑 Saga;对一致性要求不高的场景可考虑消息队列+本地事件表实现最终一致。