Q:疑问:

saga是为了解决什么核心痛点而发明的?
为什么人家关于saga的教程一开始就是说的saga的核心思想是把长事务拆分为多个短事务,我很懵圈,刚开始学习分布式事务的时候就是多个微服务分别执行的不同事务,现在直接上来就是一个长事务,在搞什么飞机???

我太理解你现在的这种“CPU烧了”的感觉了!你之所以懵圈,是因为你跳进了一个语境陷阱

你之前的认知是:分布式事务 = 多个微服务的集合(这没错)。
但 Saga 说的 “长事务”,重点不在于“微服务多”,而在于**“时间跨度大”“外部不可控”**。

咱们直接把这架“飞机”拆开了看:


1. 核心痛点:为什么 AT/TCC 搞不定?

想象一个现实场景:订一张去西藏的旅游套票
这个业务流程如下:

  1. 订机票(航司接口,响应可能要几秒甚至几分钟)。
  2. 订酒店(另一家公司)。
  3. 租车(又是一家公司)。

痛点一:锁定时间太长(死锁灾难)

如果你用 AT 或 TCC,你必须等机票、酒店、租车全都“Try”成功了,才能统一“Confirm”。

  • 问题: 万一航司接口慢,你的数据库连接、酒店的库存就会一直被锁着。在高并发下,整个系统瞬间卡死。这叫同步阻塞

痛点二:人家不配合你(外部系统)

航司和酒店的接口是人家写的,人家根本不提供 prepare 接口,也不让你在他们数据库里建 undo_log 表。

  • 问题: AT/TCC 这种需要“两阶段协议”配合的方案,遇到第三方系统直接抓瞎。

2. 所谓“长事务”到底在搞什么飞机?

你说的“分布式事务就是多个短事务组合”是对的,但 Saga 换了个思路。

Saga 的核心思想:
既然我没法让大家停下来等我(不准加锁),那我就**“先斩后奏”**。

  • 普通分布式事务(AT/TCC):大家先别真动,等我口令,一起动(预防式)。
  • Saga 模式:大家直接动!第一个人干完了,第二个人接着干。如果最后一个人失败了,前面干完的人再想办法“擦屁股”(补偿式)。

为什么要叫“长事务”?
因为它允许整个业务逻辑持续几分钟、几小时甚至几天。比如你办贷款,银行审批要 3 天,这 3 天里分布式事务一直挂着,AT 模式早崩溃了,但 Saga 可以安稳地等 3 天,等审批结果出来了再走下一步。


3. Saga 的回滚逻辑:补偿事务

Saga 没有任何 undo_log 或冻结机制。它回滚靠的是**“反向业务操作”**。

步骤正常动作 (T)补偿动作 ©
1. 订机票扣款买票退票(扣手续费也得退)
2. 订酒店预定房间取消预定
3. 租车扣押金退押金

如果租车失败了:
Saga 会自动调用“取消预定酒店”和“退机票”的接口。虽然机票钱退回来可能少了点手续费(最终一致性),但业务逻辑闭环了。


4. 架构师视角的总结:怎么选?

维度AT / TCCSaga
实时性强(数据立刻一致)弱(最终一致)
隔离性高(别人改不了我的数据)低(容易产生“脏写”,钱可能被提前花掉)
适用场景内部微服务、数据库操作跨组织、长流程、第三方支付、审批流

简单一句话:

AT/TCC 是为了“万无一失”地锁住资源;而 Saga 是为了在“管不到别人”的情况下,通过“事后补偿”来保命。

你现在感觉“搞飞机”,可能是因为你目前的练习项目都是本地微服务,还没碰到过那种需要调用“携程”、“支付宝”或者“短信网关”这种完全不归你管的情况。一旦碰到这种“外人”,除了 Saga,你没别的招。

更多推荐