1. 分布式事务概述:CAP理论、BASE理论、分布式事务的挑战与场景

1.1 从单机事务到分布式事务

在单体应用时代,事务由数据库的 ACID 特性保障:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。然而,当系统拆分为多个微服务、数据分散到不同数据库实例后,单机事务的本地锁和日志机制无法跨网络协调。分布式事务应运而生,它是一组跨多个独立节点(服务、数据库、消息队列)的操作,要么全部成功提交,要么全部回滚,从而保证全局数据一致性。

核心矛盾: 分布式系统无法同时满足一致性、可用性和分区容错性,这是 CAP 定理的核心结论,也是分布式事务设计的根本约束。

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

CAP 理论由 Eric Brewer 在 2000 年提出,描述了分布式系统在以下三个属性之间的权衡:

属性 英文 说明
C — 一致性 Consistency 所有节点在同一时刻看到的数据完全相同。写操作完成后,任何后续读操作都能读到最新值。
A — 可用性 Availability 每个请求都能获得一个(非错误的)响应,但不保证响应包含最新数据。
P — 分区容错性 Partition Tolerance 系统在网络分区(节点间通信中断)时仍能继续运行。

定理核心: 在分布式系统中,P(分区容错性)是必须满足的,因为网络分区是不可避免的。因此,设计者只能在 CP(强一致性 + 分区容错) 和 AP(高可用 + 分区容错) 之间做出选择。

  • CP 系统: 优先保证一致性,牺牲部分可用性。例如:ZooKeeper、etcd。当发生分区时,非多数派节点停止服务。
  • AP 系统: 优先保证可用性,牺牲强一致性,允许最终一致。例如:Eureka、Cassandra。分区时所有节点继续响应,但数据可能不一致。
CAP 理论:分布式系统不可能三角 C 一致性 A 可用性 P 分区容错 CA CP AP P 是必选项,实际设计在 CP 与 AP 之间权衡

1.3 BASE 理论:AP 系统的实践哲学

BASE 理论是 CAP 理论中 AP 侧的具体延伸,由 eBay 架构师 Dan Pritchett 提出。它强调系统在无法保证强一致性时,通过牺牲即时一致性来换取高可用性,最终达到数据一致。

缩写 全称 含义
BA Basically Available 基本可用。系统允许出现部分功能降级,但核心服务始终可用。
S Soft State 软状态。允许系统在不同时刻存在中间状态,不要求强一致。
E Eventually Consistent 最终一致性。经过一段时间后,所有副本数据最终达到一致。
实践启示: 在 Go 微服务架构中,BASE 理论指导我们使用异步消息、补偿事务(Saga)、本地消息表等模式,在保证可用性的前提下,通过重试和幂等设计实现最终一致。

1.4 分布式事务面临的核心挑战

相比单机事务,分布式事务在以下四个维度面临严峻挑战:

  1. 网络不可靠: 消息延迟、丢包、乱序、分区。事务协调者与参与者之间的通信随时可能中断。
  2. 节点故障: 任意参与者可能崩溃、重启或磁盘损坏,导致事务状态丢失。
  3. 时钟不一致: 不同机器的物理时钟存在偏差,难以精确判断事件先后顺序,影响超时和锁机制。
  4. 状态协调复杂: 两阶段提交(2PC)存在同步阻塞和协调者单点问题;三阶段提交(3PC)引入超时机制但增加了协议复杂度。
避坑提醒: 不要试图用分布式事务解决所有一致性问题。对于非关键数据(如用户浏览记录、日志),优先采用最终一致方案;对于资金、库存等强一致场景,务必设计幂等接口和补偿回滚逻辑。

1.5 典型应用场景

分布式事务并非适用于所有场景,以下三类场景是它的主要战场:

场景 示例 推荐方案
跨库转账 用户 A 在银行 X 扣款,用户 B 在银行 Y 入账 TCC(Try-Confirm-Cancel)或 Saga
订单与库存 下单扣库存、支付减余额、物流创建运单 本地消息表 + 消息队列 + 最终补偿
多服务写操作 用户注册同时创建账户、初始化积分、发送欢迎邮件 Saga 编排模式
分布式事务典型场景:订单-库存-支付流程 用户 订单服务 库存服务 支付服务 消息队列 下单请求 扣库存 发起支付 发送结果 异步回调/补偿 任意步骤失败 → 触发补偿事务(Saga 回滚) 最终一致性通过消息队列异步保证

1.6 本章小结

  • CAP 理论 揭示了分布式系统必须在一致性、可用性、分区容错性中三选二,而 P 是必选项。
  • BASE 理论 为 AP 系统提供了“基本可用 + 软状态 + 最终一致”的实践路径。
  • 分布式事务面临 网络不可靠、节点故障、时钟偏差、状态协调复杂 四大挑战。
  • 典型场景包括 跨库转账、订单库存联动、多服务写操作,需根据业务一致性要求选择 TCC、Saga 或消息表方案。