在 Spring Cloud 微服务集群中 “没用到 Seata 的四种事务模式” 是很常见的情况 —— 要么是业务场景暂未触发分布式事务,要么是隐性用了 “朴素方案” 却没意识到,也可能存在未暴露的分布式事务风险。下面拆解核心问题,并给出落地建议:
首先要明确:只有跨服务 / 跨数据源的写操作,才需要分布式事务。如果你的系统符合以下情况,暂时不用分布式事务是合理的:
- 微服务仅做 “单一写操作”:比如订单服务只写订单库、库存服务只写库存库,服务间只有读依赖(如订单服务查库存),无跨服务写;
- 业务允许 “最终一致” 且用了 “非事务方案”:比如通过 MQ 异步通知(如下单后发 MQ 给库存扣减,失败重试);
- 所有写操作集中在单个服务 / 数据源:微服务拆分仅做读请求分发,核心写操作未拆分。
但如果存在以下场景,却没做分布式事务控制,大概率有数据不一致风险:
- 场景 1:下单流程(订单服务创建订单 + 库存服务扣减库存 + 支付服务扣减余额),三个服务都有写操作;
- 场景 2:跨库操作(同一服务连接多个 MySQL 库,同时写 A 库和 B 库);
- 场景 3:定时任务跨服务批量更新数据(如批量发货:订单服务改状态 + 物流服务创单)。
常见原因有 3 类,可以对照自查:
很多团队没引入 Seata,但用了更简单的方式处理分布式事务,只是没归类到 Seata 的四种模式:
微服务初期拆分较粗,核心写操作(如订单 + 库存)仍在同一个服务 / 数据库,仅拆分了读服务(如商品查询、用户查询),此时分布式事务问题未暴露;但随着业务迭代,一旦拆分写操作,数据不一致问题会立刻出现。
比如电商场景中,“下单扣库存失败” 可通过人工兜底(客服补单),业务侧能接受少量不一致,因此没必要引入复杂的分布式事务框架。
如果你的系统存在分布式事务风险,建议按以下步骤落地,避免一次性引入复杂框架:
梳理出所有 “跨服务 / 跨数据源写操作” 的流程(如下单、退款、发货),标注:
- 是否要求 “强一致”(如金融扣款,不允许扣钱未下单);
- 是否允许 “最终一致”(如物流状态更新,延迟几秒同步可接受);
- 并发量高低(高并发场景优先性能,低并发优先一致性)。
Seata 与 Spring Cloud 天然兼容(支持 Nacos/Eureka 注册、Feign 调用传递 XID),推荐选型:
- 先部署 Seata TC(事务协调器):集群化部署,对接 Nacos 配置 / 注册中心;
- 对核心链路(如下单)接入 Seata AT 模式:
- 引入依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
- 加注解:在发起全局事务的入口方法(如订单服务的 createOrder)加
@GlobalTransactional;
- 配置 undo_log 表:Seata AT 模式需要在每个业务库创建 undo_log 表(用于回滚);
- 非核心链路保留 MQ 异步重试(最终一致),无需强制接入 Seata。
如果你的系统满足以下条件,完全可以不引入 Seata:
- 所有写操作都在单一服务 / 数据源内完成;
- 跨服务操作只有读请求,无写操作;
- 业务能容忍少量数据不一致,且有人工兜底机制。
但如果已经出现 “数据对账不一致”“人工补单频繁” 等问题,建议优先从 Seata AT 模式切入(无代码侵入,改造成本最低),先解决核心链路的一致性问题。