2. 分布式事务概述:定义、理论与典型场景

在事件风暴画布中,当我们将一个业务流拆解为多个聚合、多个限界上下文时,原本在单体数据库内由本地事务保证的原子性、一致性、隔离性和持久性,就变成了跨库、跨服务、跨消息的分布式一致性问题。理解分布式事务的定义、核心理论以及典型场景,是后续在画布上定位故障和优化性能的前提。

2.1 分布式事务的定义

分布式事务是指参与事务的多个资源(数据库、消息队列、服务实例)分布在不同的网络节点上,但仍需保证这些操作要么全部成功提交,要么全部失败回滚的一种处理机制。与本地事务(ACID)不同,分布式事务面临网络延迟、节点宕机、数据分区等不确定性挑战。

对比维度 本地事务(单体) 分布式事务(微服务/跨库)
资源范围 单个数据库实例 多个数据库、服务、消息中间件
一致性模型 强一致性(ACID) 最终一致性(BASE)或强一致性(2PC)
回滚代价 低,数据库自动回滚 高,需补偿事务或Saga编排
故障类型 SQL错误、死锁 网络分区、节点宕机、超时、幂等问题

2.2 CAP定理与BASE理论

CAP定理是分布式系统的基石,它指出一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)中的两项。BASE理论则是对CAP的实践妥协,强调基本可用(Basically Available)、软状态(Soft State)和最终一致性(Eventually Consistent)。

核心权衡: 在分布式事务设计中,网络分区(P)是必然发生的,因此我们必须在C(强一致性)和A(高可用)之间做出选择。选择CP(如ZooKeeper)还是AP(如Eureka),直接决定了事务协议的选择(2PC vs TCC vs Saga)。
CAP定理与BASE理论对比 CAP 定理 一致性 (C) 可用性 (A) 分区容错 (P) CP (ZooKeeper) AP (Eureka) CA (单体) BASE 理论(AP 路线的实践) 基本可用 (BA) 软状态 (S) 最终一致 (E)

2.3 分布式事务的典型场景

在事件风暴画布中,以下三种场景是分布式事务故障的高发区,也是性能瓶颈的常见来源。

2.3.1 跨库事务

当同一个微服务内的多个聚合需要操作不同的物理数据库(如订单库与库存库),且要求强一致性时,就会产生跨库分布式事务。典型方案包括:

  • XA协议(2PC): 通过全局事务协调器(TM)协调多个资源管理器(RM),实现两阶段提交。性能较差,锁持有时间长。
  • AT模式(Seata): 通过代理数据源自动生成反向SQL(UNDO_LOG),实现最终一致性,对业务代码侵入小。
故障排查提示: 跨库事务最常见的故障是“全局锁等待超时”和“二阶段回滚失败导致脏数据”。在事件风暴画布中,应明确标注每个聚合的数据库归属,避免画布上出现“隐式跨库”操作。

2.3.2 跨服务事务

跨服务事务发生在多个微服务之间,通常通过RPC(gRPC/Dubbo)或HTTP REST进行调用。典型模式包括:

  • TCC(Try-Confirm-Cancel): 业务层面实现两阶段,Try阶段预留资源,Confirm阶段执行,Cancel阶段回滚。对业务侵入大,但性能优于XA。
  • Saga(编排/协同): 将长事务拆分为多个本地事务,每个本地事务完成后发布事件或调用下一个服务;失败时执行补偿事务。适合长时间、高吞吐的场景。
模式 一致性强度 性能 业务侵入 典型故障
TCC 强一致性(准) 中等 高(需实现Try/Confirm/Cancel) 空回滚、幂等、悬挂
Saga 最终一致性 高(异步) 低(只需实现正向/补偿) 补偿丢失、事件乱序
2PC(XA) 强一致性 低(锁资源) 低(中间件支持) 协调器单点、阻塞
跨服务事务典型模式:TCC vs Saga TCC 模式(两阶段业务补偿) Try 预留资源 Confirm 执行提交 Cancel 回滚补偿 特点:强一致性、锁资源、业务侵入高 Saga 模式(事件驱动补偿) 服务A 正向 服务B 正向 服务C 正向 补偿A ← 补偿B ← 补偿C 特点:最终一致性、异步、高吞吐 故障排查要点 TCC:空回滚、幂等、悬挂检查 | Saga:补偿事件丢失、消息乱序、幂等性 选择建议 选 TCC 当: 短事务、强一致要求、资源可预占 选 Saga 当: 长事务、高吞吐、可接受最终一致

2.3.3 跨消息事务

跨消息事务通常指“本地消息表”或“事务消息”模式,用于保证数据库操作与消息发送的原子性。典型场景是:订单服务写入订单表后,必须可靠地发送一条“订单已创建”消息到MQ,供库存/物流服务消费。

  • 本地消息表: 在业务数据库中创建消息表,业务操作与消息插入在同一个本地事务中;后台定时任务扫描消息表并发送MQ,消费方确认后删除消息。
  • 事务消息(RocketMQ): 半消息机制:先发送半消息(对消费者不可见),执行本地事务,根据本地事务结果commit或rollback半消息。
性能优化提示: 跨消息事务的瓶颈通常在于“本地消息表轮询”的延迟和“事务消息”的回查次数。在事件风暴画布中,建议将消息发送与业务操作放在同一个聚合边界内,减少跨聚合的最终一致等待。

2.4 本章小结