下单要扣库存,付款要改账户余额,发货还要写一条物流记录。单体应用里,这些操作放在一个本地事务中就能兜住。拆成微服务后,每个服务各守一个数据库,中间任何一步失败,前面已完成的动作都需要有人来收拾。很多团队卡在这一步,问题往往不在技术选型,而是没有先想清楚数据该怎么对齐。阿里云 GTS(分布式事务服务)是云上的托管方案,下面结合一个电商下单的例子,讲讲它怎么用,以及容易出问题的地方。

跨服务之后,本地事务管不到的地方
单体应用里,多个操作要么一起成功,要么一起回滚,这件事由数据库替你完成。微服务拆开后,事务边界就断在了服务之间的网络调用上。早期常见的做法是各服务自己写补偿逻辑:扣库存失败就回滚订单,核销失败就退款。问题在于异常分支会越写越多,超时、重复调用、补偿本身失败,这些情况很难全部想到。线上出现不一致时,排查要在几个服务的日志里来回对时间线。
所以分布式事务要解决的,是让跨服务的数据操作最终落在一个一致的结果上。业内常用的思路有两阶段提交、TCC、SAGA,以及基于消息的最终一致性。它们各有代价:强一致通常意味着更长的锁持有时间,最终一致则要求业务能接受短暂的中间状态。选哪种,先要问清楚这个业务能不能容忍几秒钟的不一致窗口。
GTS 支持的几种事务模式
GTS 是全托管的分布式事务中间件,兼容开源社区的 Seata 协议。事务协调器的部署、高可用和监控告警由云平台负责,业务团队可以把精力放在业务代码上。它支持的模式,按改造成本从低到高大致可以这样理解:
- AT模式:对业务代码基本无侵入。框架解析 SQL,在执行前后分别记录前镜像和后镜像,失败时据此生成回滚语句。业务以关系型数据库为主时,这通常是最省事的起点。
- TCC模式:业务方要自己实现 Try、Confirm、Cancel 三个接口,资源预留和释放的规则也由业务定义。适合额度冻结、优惠券核销这类需要精确控制可用量的场景。代价是每个接口都要认真处理幂等和空回滚。
- SAGA模式:把长流程拆成一串本地事务,每一步配一个补偿操作。流程长、会调用外部系统时比较合适,比如跨境支付或多方对账,外部系统没法纳入同一个事务。
- XA模式:依托数据库原生的两阶段提交,一致性最强,但会占用较多数据库锁资源。并发高的链路上使用前,要先评估它对吞吐量的影响。
实际选型时,可以先看哪些环节真的需要强一致。多数业务里,只有少数几步是关键的,其余步骤用最终一致就够了。把所有步骤都塞进同一种模式,往往是成本最高的做法。
一个下单链路的改造过程
以一家中型电商平台为例。它的下单流程由订单、库存、营销三个服务依次调用完成。上线初期,大促期间偶尔会出现订单已创建、库存却没扣减,或者优惠券已核销、订单又被取消的情况。团队一开始用定时任务补偿,但补偿逻辑散落在三个服务里,改一处就要同时看另外两处,排查一次问题常常要花不少时间。
后来他们做了几件事。订单服务作为事务发起方,用全局事务注解包住下单主流程,事务边界集中到一处。库存扣减改用 AT 模式,回滚日志交给框架记录,手写的补偿代码因此少了很多。优惠券因为涉及额度冻结,单独改用 TCC,把 Try 阶段预留多少、Cancel 阶段释放什么写成明确的规则。最后在 GTS 控制台配置了事务超时时间和全局锁等待策略,并接入告警,异常事务出现后能及时被看到。
改造上线后,团队反馈跨服务数据不一致的工单少了,补偿任务的维护范围也比以前小。不过这个结果和他们的业务规模、SQL 复杂度、并发水平有关,不能直接套到别的系统上。建议先在预发布环境压测,确认数据和性能都符合预期,再全量切换。
接入时容易踩的几个坑
有几个问题在动手前最好想清楚。
- 全局事务别包太大:范围越大,锁持有的时间越长,并发冲突也越多。只把真正需要一致性的步骤放进去,非关键操作可以异步处理,比如发通知、写操作日志。
- Confirm 和 Cancel 必须幂等:网络超时和重试会让同一个分支被调用多次。接口要能接受重复请求,还要处理“还没 Try 就收到 Cancel”的空回滚情况。
- 热点数据的全局锁要提前看:AT 模式下,同一行数据的并发修改会争抢全局锁。热门商品的库存就是典型例子,可以考虑把库存拆成多条记录分散压力,或者先预扣、再异步结算。
- 对账不能省:事务框架能兜住大部分异常,但不是全部。定期跑一次对账任务,比出了问题再去翻日志便宜得多。
- 压测要和原链路对比:分布式事务会增加网络往返和日志写入,上线前用同样的流量跑一遍改造前后的链路,才能看出真实的开销。
写在最后
分布式事务没有一套通用方案。选型前,先搞清楚业务能接受多大的不一致,哪些步骤必须同时成功,哪些可以事后补齐。想清楚这些,再对照 AT、TCC、SAGA 的特点去选,会顺很多。阿里云 GTS 把协调器的运维托管出去,团队可以把精力放在事务边界和幂等设计上。对于想尽快解决跨服务一致性问题的团队,它是值得评估的一个选项。