Seata
Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
适用场景:微服务架构的分布式事务、跨服务的数据一致性、订单/库存/余额等业务的事务处理。
提示
阿里巴巴开源的分布式事务解决方案,支持AT/TCC/SAGA模式
核心概念
| 概念 | 说明 |
|---|---|
| TC (Transaction Coordinator) | 事务协调器(全局事务的管理者),管理全局事务和分支事务的状态 |
| TM (Transaction Manager) | 事务管理器(发起全局事务的入口),定义全局事务的边界,发起全局事务的开始和提交/回滚 |
| RM (Resource Manager) | 资源管理器(管理数据库连接),管理分支事务的资源,向 TC 注册分支事务并报告状态 |
事务模式
AT 模式
AT 模式是 Seata 的默认模式,基于 SQL 解析自动生成回滚日志(记录数据修改前后的状态,用于回滚)。
原理:
- 一阶段:拦截 SQL,记录 before image(修改前的数据)和 after image(修改后的数据),生成 undo log
- 二阶段提交:删除 undo log
- 二阶段回滚:根据 undo log 生成反向 SQL 执行回滚
TCC 模式
TCC 模式需要业务自己实现 Try、Confirm、Cancel 三个接口。
| 阶段 | 说明 |
|---|---|
| Try | 检查和预留业务资源(如冻结库存、冻结余额) |
| Confirm | 确认执行,使用 Try 阶段预留的资源(如扣减库存、扣减余额) |
| Cancel | 取消执行,释放 Try 阶段预留的资源(如解冻库存、解冻余额) |
SAGA 模式
SAGA 模式将长事务拆分为多个本地短事务,每个短事务有对应的补偿操作。
快速开始
引入依赖:
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.7.0</version>
</dependency>配置:
seata:
enabled: true
application-id: ${spring.application.name}
tx-service-group: my_tx_group
registry:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
config:
type: nacos
nacos:
server-addr: 127.0.0.1:8848使用 @GlobalTransactional 注解开启全局事务:
@GlobalTransactional
public void createOrder(OrderDTO orderDTO) {
// 扣减库存
storageService.deduct(orderDTO.getProductId(), orderDTO.getCount());
// 扣减余额
accountService.debit(orderDTO.getUserId(), orderDTO.getMoney());
// 创建订单
orderMapper.insert(orderDTO);
}模式对比
| 模式 | 一致性 | 性能 | 侵入性 | 适用场景 |
|---|---|---|---|---|
| AT | 最终一致 | 高 | 低 | 常规业务 |
| TCC | 最终一致 | 中 | 高 | 高一致性要求 |
| SAGA | 最终一致 | 中 | 中 | 长事务 |
常见问题处理
全局事务不生效
- 检查
@GlobalTransactional注解是否正确 - 确认 Seata Server 是否正常运行
- 检查
tx-service-group配置是否正确
回滚失败
- 检查 undo log 是否正确生成
- 确认数据库连接是否正常
- 检查分支事务是否正确注册