Skip to content

分布式事务 Seata

TIP

在微服务架构中,一个业务操作可能涉及多个服务。Seata 是一款开源的分布式事务解决方案,提供 AT、TCC、SAGA 和 XA 四种模式。

分布式事务的场景

java
// 下单业务涉及多个服务
@Transactional
public void createOrder(Order order) {
    orderService.create(order);       // 订单服务
    inventoryService.deduce(order);   // 库存服务 → 远程调用
    accountService.debit(order);      // 账户服务 → 远程调用
    // 任一失败都需要全部回滚
}

Seata AT 模式(自动)

AT 模式是 Seata 最常用的模式,对业务代码无侵入。

工作原理

1. TM 向 TC 开启全局事务
2. RM 执行业务 SQL,自动生成回滚镜像
3. 所有 RM 都成功 → TC 提交全局事务
4. 任一 RM 失败 → TC 通知所有 RM 回滚

架构组件

yaml
TC(Transaction Coordinator):事务协调器
TM(Transaction Manager):事务管理器
RM(Resource Manager):资源管理器

引入依赖

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

配置 Seata

yaml
seata:
  enabled: true
  application-id: ${spring.application.name}
  tx-service-group: my_test_tx_group
  service:
    vgroup-mapping:
      my_test_tx_group: default
    grouplist:
      default: 127.0.0.1:8091
  config:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848

使用分布式事务

java
@Service
public class BusinessService {

    @Autowired
    private OrderService orderService;
    @Autowired
    private InventoryService inventoryService;
    @Autowired
    private AccountService accountService;

    // @GlobalTransactional 开启分布式事务
    @GlobalTransactional(name = "create-order", rollbackFor = Exception.class)
    public void createOrder(Order order) {
        // 本地事务
        orderService.create(order);
        // 远程调用
        inventoryService.deduce(order.getProductId(), order.getQuantity());
        accountService.debit(order.getUserId(), order.getTotalPrice());
    }
}

四种模式对比

模式性能一致性代码侵入适用场景
AT最终一致大多数业务场景(推荐)
TCC最终一致银行、支付等核心场景
SAGA最终一致长事务、编排复杂
XA强一致对一致性要求极高的场景

WARNING

分布式事务有性能开销,建议仅在确实需要跨服务事务时使用。可以考虑通过最终一致性 + 补偿机制解决。