Skip to content

分布式事务

一个订单服务调用了库存服务、账户服务、仓储服务。

四个服务,四个数据库,怎么保证「订单创建成功,库存扣减成功,余额扣减成功,库存入库成功」?

这就是分布式事务要解决的问题。

模块速览

分布式事务的解决方案分为两大类:强一致性方案和最终一致性方案。

章节篇数核心内容
解决方案总览7 篇AT、TCC、SAGA、可靠消息、最大努力通知、方案对比
原理深度剖析7 篇XA 规范、Seata 架构、全局事务、TCC 问题

方案对比

方案一致性侵入性性能适用场景
XA强一致中等多数据库强一致
AT最终一致普通业务场景
TCC强一致资源敏感场景
SAGA最终一致长事务编排
可靠消息最终一致异步解耦

选型决策树

业务代码能改吗?
├─ 不能 → AT 模式(零侵入)
└─ 能 ↓

资源敏感吗?(库存、资金)
├─ 是 → TCC 模式(高性能)
└─ 否 ↓

事务时间长?(> 1 分钟)
├─ 是 → SAGA 模式(长事务)
└─ 否 → AT 模式 / 可靠消息

面试高频问题

Q1:分布式事务的解决方案有哪些?

「五种:XA、AT、TCC、SAGA、可靠消息。 XA 是数据库层面的强一致,性能差但可靠。 AT 是 Seata 的零侵入方案,通过 undolog 自动补偿。 TCC 是业务层面的强一致,性能高但侵入性大。 SAGA 适合长事务,通过补偿操作实现最终一致。 可靠消息通过 MQ 保证最终一致,性能最高但延迟大。」

Q2:TCC 的空回滚、幂等、悬挂问题怎么解决?

「三个问题的本质都是分布式系统的经典问题: 空回滚——用 Try 执行记录解决,Cancel 前检查记录是否存在。 幂等——用唯一键 + 状态机解决,无论执行多少次结果一致。 悬挂——用状态转移检查解决,Cancel 前确认是否已 Confirm。」

Q3:Seata AT 模式的全局锁和数据库锁有什么区别?

「数据库锁防止并发事务之间的脏写,Seata 全局锁防止跨全局事务的脏写。 两者的作用域不同,数据库锁是单节点内的,Seata 全局锁是跨节点的。 两者配合,共同保证隔离性。」

延伸阅读

分布式事务没有银弹,每种方案都是一致性、性能、开发成本的权衡。

建议结合具体业务场景理解:

  • 电商下单:TCC(库存/余额)+ AT(订单)+ 可靠消息(通知)
  • 金融转账:TCC(强一致)
  • 订单流水线:SAGA(长事务)

基于 VitePress 构建