Seata 是阿里巴巴开源的 分布式事务解决方案,全称是 Simple Extensible Autonomous Transaction Architecture。Seata 的目标是提供一个 高性能且易于使用的分布式事务服务,来解决微服务架构中最常见、最头疼的问题之一:分布式事务一致性问题。
一、为什么需要 Seata?
在微服务架构中,一个业务操作通常会涉及到多个服务,比如一个电商下单流程可能会调用:
- 订单服务
- 库存服务
- 账户服务
这些服务背后分别使用不同的数据库或存储系统,传统的数据库事务(如 JDBC 本地事务)无法跨数据库生效。这时候如果某一步失败,其它服务就可能出现数据不一致,造成严重问题。
于是需要一种机制来协调多个服务或数据库中的事务操作,这就是“分布式事务”。
二、Seata 能解决什么问题?
Seata 提供了完整的分布式事务解决方案,具有以下特点:
特性 | 说明 |
---|---|
支持多种事务模式 | 包括 AT、TCC、SAGA、XA |
事务隔离性强 | 尽量保证 ACID |
高性能 | 基于异步处理和事务日志 |
服务自动注册/发现 | 支持注册中心(如 Nacos、Eureka) |
Spring Cloud / Dubbo / gRPC 支持 | 与主流 RPC 框架集成 |
支持多种数据库 | MySQL、Oracle、PostgreSQL 等 |
三、Seata 架构解析(重点)
Seata 架构主要由三个核心角色组成:
┌───────────┐ ┌───────────────┐ ┌───────────┐
│ │ │ │ │ │
│ RM(资源管理器)│<------>│ TC(事务协调者) │<------>│ TM(事务管理器)│
│ │ │ │ │ │
└───────────┘ └───────────────┘ └───────────┘
1. TM(Transaction Manager,事务管理器)
- 负责开启全局事务,提交或回滚全局事务。
- 由业务系统发起。
- 使用 @GlobalTransactional 注解标注分布式事务的入口。
2. TC(Transaction Coordinator,事务协调器)
- 核心组件。
- 维护全局事务的状态。
- 负责协调各 RM 的提交/回滚操作。
- 相当于“分布式事务调度中心”,是一个独立部署的服务。
3. RM(Resource Manager,资源管理器)
- 管理分支事务的资源(如数据库连接、SQL 等)。
- 把事务状态通知 TC。
- 在 TC 发出命令时执行 本地提交或回滚。
四、事务流程详解(以 AT 模式为例)
AT 模式(Automatic Transaction)是 Seata 最主流也最简单的事务模式,适用于关系型数据库 + 业务无强逻辑依赖的场景。
1. 开启全局事务(由 TM 发起)
@GlobalTransactional
public void placeOrder() {
orderService.createOrder();
stockService.deductStock();
accountService.deductMoney();
}
TM 向 TC 发起全局事务创建请求。
2. 各服务执行本地业务逻辑(由 RM 管理)
比如订单服务执行:
insert into orders ...
此时 RM 拦截 SQL,自动生成:
- 前镜像(Before Image):更新前的数据快照
- 后镜像(After Image):更新后的数据快照
- 并记录到 undo_log 表中,保证可以回滚
3. 全局事务提交或回滚
如果所有服务调用成功,TM 通知 TC 执行“全局提交”
- TC 通知各 RM 提交本地事务
- RM 删除 undo_log
如果中间某个服务失败或抛出异常,TM 通知 TC 执行“全局回滚”
- TC 通知各 RM 回滚本地事务
- RM 利用 undo_log 中的前镜像还原数据
五、事务模式比较
模式 | 说明 | 适用场景 |
---|---|---|
AT | 自动事务,拦截 SQL,生成 undo_log | 强一致性、关系型数据库 |
TCC | Try-Confirm-Cancel 手动编排 | 业务强逻辑控制、幂等性要求高 |
SAGA | 有状态长事务,定义补偿逻辑 | 异步解耦场景、柔性事务 |
XA | 标准的两阶段提交协议 | 高一致性要求、数据库支持 XA |
六、AT 模式示意图
用户请求
↓
TM(开启全局事务)
↓
业务调用A → RM拦截SQL并生成undo_log
↓
业务调用B → RM拦截SQL并生成undo_log
↓
业务调用C → RM拦截SQL并生成undo_log
↓
TM 提交 or 回滚
↓
TC 通知各 RM 提交/回滚
↓
RM 提交或根据 undo_log 回滚数据
七、使用示例(Spring Cloud + Seata)
1. 引入依赖
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.7.0</version>
</dependency>
2. 配置文件(application.yml)
seata:
enabled: true
tx-service-group: my_tx_group
service:
vgroup-mapping:
my_tx_group: default
registry:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
3. 启用分布式事务
@GlobalTransactional
public void createOrder() {
orderService.create();
storageService.deduct();
accountService.debit();
}
八、undo_log 表
Seata 会为每个参与分支自动记录一张 undo_log 表,格式如下:
| id | branch_id | xid | context | rollback_info | log_status |
这是 AT 模式中最关键的本地回滚机制支撑,确保即便某服务异常也可恢复数据。
九、Seata 与其他解决方案对比
方案 | 特点 |
---|---|
Seata(AT 模式) | 自动化强、开发简单、侵入低、适合小中型分布式系统 |
TCC | 手动控制,适合需要幂等、校验、复杂回滚逻辑 |
MQ事务(RocketMQ事务消息) | 最终一致性,适合异步操作 |
本地消息表 + 补偿 | 灵活性强但开发复杂,适合企业定制场景 |
十、总结
维度 | 说明 |
---|---|
使用简单性 | ⭐⭐⭐⭐⭐(@GlobalTransactional 即可) |
扩展性 | ⭐⭐⭐⭐(支持多种事务模式) |
性能 | ⭐⭐⭐⭐(异步化、压缩 undo_log) |
场景适配度 | ⭐⭐⭐⭐⭐(适配大部分微服务) |
依赖性 | 需部署 TC Server,数据库需支持 undo_log 表 |
如果你需要:
- 快速实现微服务分布式事务
- 不希望侵入业务代码
- 希望控制性能与一致性的权衡
那么 Seata AT 模式 是当前 Java 生态下非常值得使用的方案。