Seata 分布式事务
Seata 是阿里开源的分布式事务框架,Spring Cloud Alibaba 通过 spring-cloud-starter-alibaba-seata 集成。原理与模式见 Seata。
依赖
<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 |
| TC | Seata Server 协调二阶段提交/回滚 |
模式选型
| 模式 | 说明 | Spring 使用 |
|---|---|---|
| AT | 自动补偿,侵入小 | @GlobalTransactional + JDBC |
| TCC | Try/Confirm/Cancel 三接口 | 业务实现三个方法 |
| Saga | 长流程编排 | Seata Saga 状态机或手工补偿 |
| XA | 数据库原生 2PC | 性能差,少用 |
与秒杀 / 库存
强一致库存更常用 Redis Lua + 订单幂等(秒杀),而非 Seata 全局事务。Seata 适合:
- 跨服务扣款 + 写订单 + 写积分等同属「必须一起成功」的短事务链
- 分库后单请求跨分片写(仍应尽量减少)
常见问题
| 问题 | 处理 |
|---|---|
| 全局锁超时 | 缩短事务、避免 Feign 内长 IO |
| undo_log 膨胀 | 定期清理、监控 TC |
| 与 MQ 混用 | 事务消息用 RocketMQ 或本地消息表 |