



























如果说 TCC 和 Saga 是分布式事务的“理论模式”,那么 Seata 就是将这些理论落地的“工业级武器”。
Seata(Simple Extensible Autonomous Transaction Architecture)是阿里巴巴开源、目前捐赠给 Apache 的顶级项目。它是目前 Java 微服务生态(Spring Cloud Alibaba, Dubbo 等)中最主流、最成熟的分布式事务解决方案。
简单来说,Seata 就像一个“事务总管”,它帮你处理了跨服务调用的复杂协调工作,让你只需加一个注解就能实现分布式事务。
Seata 的架构设计非常经典,理解这三个角色是掌握 Seata 的关键:
@GlobalTransactional 注解告诉 Seata:“从这里开始,我要开启一个全局事务了”。工作流程一句话总结:TM 发起请求 -> TC 生成全局事务 ID (XID) -> RM 执行本地事务并汇报 -> TC 决定全局提交或回滚。
Seata 最强大的地方在于它支持多种模式,适配不同的业务场景。
这是 Seata 的默认模式,也是它“火”起来的原因。
undo_log 表。undo_log,生成反向 SQL(比如把 UPDATE 变成反向 UPDATE)来恢复数据。TCC 理论的具体实现。
Try、Confirm、Cancel 三个接口。对应 Saga 理论。
| 模式 | 一致性 | 性能 | 侵入性 | 复杂度 | 适用场景 |
|---|---|---|---|---|---|
| AT | 最终一致性 | ⭐⭐⭐⭐ | 低 (无侵入) | 低 | 首选,常规微服务业务 |
| TCC | 最终一致性 | ⭐⭐⭐⭐⭐ | 高 (需写3个方法) | 高 | 高并发、核心交易、非DB资源 |
| Saga | 最终一致性 | ⭐⭐⭐⭐ | 中 (需写补偿) | 中 | 长流程、跨系统、异步调用 |
| XA | 强一致性 | ⭐⭐ | 低 | 低 | 银行核心、遗留系统 |
在 Go 语言中,虽然 Seata 原生是 Java 的,但社区也有 Go 的客户端实现(或者使用 dtm 框架兼容 Seata 协议)。这里展示最经典的 Java/Spring Boot 写法,逻辑是通用的。
步骤 1:引入依赖与配置
(省略 Maven 配置,假设已集成 seata-spring-boot-starter)
步骤 2:业务代码
只需要在入口方法加一个注解 @GlobalTransactional。
@Service
public class OrderService {
@Autowired
private AccountService accountService;
@Autowired
private StockService stockService;
// 1. 开启全局事务
@GlobalTransactional
public void createOrder(Order order) {
// 2. 创建订单(本地事务)
orderMapper.insert(order);
// 3. 调用库存服务(远程调用,Seata 会自动传播 XID)
stockService.deduct(order.getProductId(), order.getCount());
// 4. 调用账户服务(远程调用)
accountService.deduct(order.getUserId(), order.getAmount());
// 如果上面任何一步抛出异常,Seata 会自动回滚所有操作
}
}
步骤 3:数据库准备
使用 AT 模式时,每个业务数据库都需要创建一张 undo_log 表,用于 Seata 存储回滚日志。
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
);
@GlobalTransactional 注解。此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。