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