🔧 一、整合核心步骤
1. 启动 Seata Server(TC)
- 环境准备:
- 修改
registry.conf
,指定注册中心(如 Nacos)和配置中心:registry {type = "nacos"nacos {serverAddr = "localhost:8848"namespace = "public"} } config {type = "nacos"nacos { serverAddr = "localhost:8848" } }
- 同步配置到 Nacos:
sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP
- 启动 Seata Server:
bin/seata-server.sh -p 8091
- 修改
- 高可用:集群部署时需确保所有节点使用相同的注册中心和事务分组。
2. 客户端(微服务)配置
- 依赖引入(Spring Cloud Alibaba):
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><exclusions><exclusion><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></exclusion></exclusions> </dependency> <dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.4.2</version> </dependency>
- 事务分组配置(
application.yml
):seata:tx-service-group: my_tx_group # 事务分组名,需与Seata Server配置一致service:vgroup-mapping:my_tx_group: default # 映射到Seata Server集群名registry:type: nacosnacos:server-addr: localhost:8848
📌 注:
tx-service-group
需在所有参与事务的微服务中保持一致。
3. 业务库准备
- 创建
undo_log
表(AT 模式必需):
此表用于记录事务回滚日志。CREATE TABLE `undo_log` (`branch_id` BIGINT NOT NULL,`xid` VARCHAR(100) NOT NULL,`rollback_info` LONGBLOB NOT NULL,UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`) ) ENGINE=InnoDB;
4. 数据源代理
- 自动代理(推荐):
seata:enable-auto-data-source-proxy: truedata-source-proxy-mode: AT # 可选 AT/XA 模式
- 手动代理(需自定义数据源):
确保所有数据库操作通过@Bean public DataSource dataSourceProxy(DataSource druidDataSource) {return new DataSourceProxy(druidDataSource); // 包装原生数据源 }
DataSourceProxy
执行。
5. 事务注解使用
- 在事务发起方的方法上添加
@GlobalTransactional
:@RestController public class OrderController {@GlobalTransactional(rollbackFor = Exception.class)@PostMapping("/create")public String createOrder() {orderService.create();inventoryService.deductStock(); // 通过Feign调用其他服务if (error) throw new RuntimeException("回滚");} }
- XID 传递:通过 Feign/RestTemplate 调用时,Seata 自动传递全局事务 ID(XID)。
⚙️ 二、事务模式配置
1. AT 模式(默认)
- 依赖
undo_log
表实现自动回滚。 - 要求业务表有单列主键,不支持多列主键(MySQL除外)。
2. TCC 模式
- 需自定义 TCC 接口:
@LocalTCC public interface TccAction {@TwoPhaseBusinessAction(name = "prepare", commitMethod = "commit", rollbackMethod = "rollback")boolean prepare(BusinessActionContext ctx, @BusinessActionContextParameter(paramName = "param") String param);boolean commit(BusinessActionContext ctx);boolean rollback(BusinessActionContext ctx); }
- 通过
@GlobalTransactional
调用 TCC 方法。
3. XA 模式
- 开启 MySQL XA 支持:
[mysqld] innodb_support_xa=1
- 修改配置:
适用于强一致性场景。seata:data-source-proxy-mode: XA
⚠️ 三、关键注意事项
-
版本兼容性:
组件 推荐版本 Spring Cloud Alibaba 2.1.1.RELEASE (Seata 1.4) Seata Client 1.4.0+ Nacos Server 1.2.1+ 避免使用 spring-cloud-alibaba-seata:2.1.2+
与 Seata 1.4.0 组合(存在兼容问题)。 -
配置一致性:
- Seata Server 与客户端的
registry.conf
和事务分组配置必须一致。 - 若使用 Nacos 配置中心,需通过
nacos-config.sh
同步配置。
- Seata Server 与客户端的
-
常见问题:
- 连接失败:检查事务分组映射(
vgroup-mapping
)和 Seata Server 注册状态。 - 数据源冲突:排除 Druid 自动配置(如
druid-spring-boot-starter
)或降级 Druid 版本。 - 跨服务调用:确保 Feign/RestTemplate 的拦截器已启用(Spring Cloud Alibaba 默认集成)。
- 连接失败:检查事务分组映射(
💎 四、最佳实践
- 事务粒度:
@GlobalTransactional
应加在业务入口层(如 Controller 或 Facade 服务)。 - 冷热分离:高频事务服务使用独立数据源,避免 undo_log 表成为性能瓶颈。
- 熔断降级:结合 Sentinel 防止事务阻塞导致雪崩。
通过以上步骤,Seata 可无缝集成到 Spring Cloud 微服务中,解决跨服务事务一致性问题。完整示例参考:Seata + Spring Cloud 实战代码。