什么是分布式事务?
在微服务架构中,一个业务操作往往需要跨多个服务完成,这就产生了分布式事务的需求。分布式事务面临着数据一致性、性能、复杂度等多重挑战。
传统解决方案的局限性:
- 2PC两阶段提交:性能较差,强一致性
- TCC事务补偿:对业务侵入大
- 本地消息表:跨服务多时复杂度急剧上升
Seata简介
Seata是阿里巴巴开源的分布式事务解决方案,提供了高性能且简单易用的分布式事务服务。
Seata的三大核心组件
- TC(Transaction Coordinator) - 事务协调器
-
- 独立部署的Seata服务端
- 维护全局事务和分支事务的状态
- TM(Transaction Manager) - 事务管理器
-
- 定义全局事务边界
- 开启、提交或回滚全局事务
- RM(Resource Manager) - 资源管理器
-
- 管理分支事务处理的资源
- 向TC注册分支事务并报告状态
TM 和 RM 是作为 Seata 的客户端与业务系统集成在一起,TC 作为 Seata 的服务端独立部署。
Seata部署
Docker快速部署Seata Server
bash
# 拉取镜像
docker pull seataio/seata-server:1.3.0
# 运行容器
docker run -d --restart always --name seata-server \
-p 8091:8091 \
-v /home/dockerdata/seata:/seata-server \
-e SEATA_IP=你的服务器IP \
-e SEATA_PORT=8091 \
seataio/seata-server:1.3.0
yml数据源配置关键点
yaml
seata:
application-id: order-service
tx-service-group: my_test_tx_group
service:
vgroup-mapping:
# 此处配置对应Server端配置registry.eureka.application的值
my_test_tx_group: default
# 注册中心配置
registry:
type: eureka
eureka:
service-url: http://127.0.0.1:9000/eureka/
weight: 1
重要提示:
- 所有参与分布式事务的服务必须配置相同的事务分组
- 数据源建议使用阿里的Druid
- 每个数据库都需要创建undo_log表

java代码示例
在业务入口方法添加注解即可:
java
@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 60000)
public void createOrder(OrderDTO orderDTO) {
// 业务逻辑
// 调用其他微服务
}
注意事项:
- 只需在顶层调用方法添加@GlobalTransactional注解
- 被调用的Feign服务无需添加任何事务注解,加了本地事务注解也没关系
- 建议明确指定rollbackFor = Exception.class
常见问题解决
问题:分支事务注册失败
csharp
Caused by: io.seata.core.exception.RmTransactionException:
Response[ TransactionException[Could not register branch into global session
xid = 121.41.42.84:8091:427856193541664768 status = TimeoutRo ]
原因: Seata的AT模型调用其他服务时是异步的,Seata的全局事务超时时间设置太短了,导致注册分支事务的时候,全局事务都已经进入第二阶段了。
解决方案:
将配置文件中的事务超时等待设置长些即可(如果60秒不够用可以在设置大些,但是对应的代码中全局事务超时(@GlobalTransactional(timeoutMills = 默认60秒))也要设置大些)
Seata AT模式原理
AT(Auto Transaction)模式是Seata的默认模式,对业务代码零侵入。
工作流程
- 第一阶段:
-
- 业务数据更新
- 生成UNDO LOG回滚日志
- 本地事务提交
- 第二阶段:
-
- 全部成功:异步删除UNDO LOG
- 出现异常:根据UNDO LOG进行数据回滚

事务模式选型指南
| 模式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| AT | 零侵入、使用简单 | 存在脏读可能 | 大部分业务场景 |
| TCC | 高性能、避免脏读 | 业务侵入大 | 对一致性要求极高 |
| SAGA | 性能最高、无锁 | 不保证隔离性 | 长流程业务 |
| XA | 强一致性 | 性能较差 | 传统数据库事务 |
为什么选择Seata?
- 代码简洁:只需一个注解即可实现分布式事务
- 性能优秀:相比传统2PC有显著性能提升
- 生态完善:支持多种注册中心和配置中心
- 模式丰富:提供AT、TCC、SAGA、XA多种模式
总结
Seata作为成熟的分布式事务解决方案,在实际项目中表现出了良好的稳定性和易用性。特别是AT模式,在保证数据一致性的同时,最大程度地降低了对业务代码的侵入,是微服务架构下分布式事务的理想选择。
对于高并发场景,可以结合TCC或消息队列实现更优的性能表现。选择合适的分布式事务方案,需要根据具体的业务需求、性能要求和团队技术栈来综合考量。
附上以前的一张评论图:

项目地址: github.com/seata/seata
本文基于实际项目经验整理,希望对你在分布式事务的探索道路上有所帮助!