Seata 分布式事务

返回 Spring Cloud

Seata 是阿里开源的分布式事务框架,Spring Cloud Alibaba 通过 spring-cloud-starter-alibaba-seata 集成。原理与模式见 Seata

默认优先 本地事务 + MQ 最终一致KafkaCDC);全局事务成本高,仅在有强一致跨库/跨服务写时使用。


依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

需部署 Seata Server(TC),各服务为 TM / RM


配置

seata:
  enabled: true
  application-id: order-service
  tx-service-group: my_tx_group
  registry:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      group: SEATA_GROUP
  config:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      group: SEATA_GROUP

数据源需被 Seata 代理(AT 模式自动注册分支事务):

spring:
  datasource:
    url: jdbc:mysql://...
    # 使用 seata 数据源代理或 spring-cloud-alibaba 自动包装

AT 模式(最常用)

@Service
public class OrderAppService {
 
    @GlobalTransactional(name = "create-order", rollbackFor = Exception.class)
    public void createOrder(OrderDTO dto) {
        orderMapper.insert(dto);           // 本地 RM
        stockFeign.deduct(dto.getSkuId()); // 远程 RM,参与同一全局事务
        accountFeign.debit(dto.getUserId()); 
    }
}
角色说明
TM开启全局事务的入口(@GlobalTransactional
RM各库分支,提交前写 undo_log
TCSeata Server 协调二阶段提交/回滚

模式选型

模式说明Spring 使用
AT自动补偿,侵入小@GlobalTransactional + JDBC
TCCTry/Confirm/Cancel 三接口业务实现三个方法
Saga长流程编排Seata Saga 状态机或手工补偿
XA数据库原生 2PC性能差,少用

与秒杀 / 库存

强一致库存更常用 Redis Lua + 订单幂等秒杀),而非 Seata 全局事务。Seata 适合:

  • 跨服务扣款 + 写订单 + 写积分等同属「必须一起成功」的短事务链
  • 分库后单请求跨分片写(仍应尽量减少)

常见问题

问题处理
全局锁超时缩短事务、避免 Feign 内长 IO
undo_log 膨胀定期清理、监控 TC
与 MQ 混用事务消息用 RocketMQ 或本地消息表

相关链接