Spring Boot整合Seata的过程详解(AT 模式)
目录
- ✅ 一:搭建 Seata Server(TC)
- ✅ 二:配置数据库(undo_log 表)
- ✅ 三:Spring Boot 项目整合 Seata
- ✅ 四:多服务协同调用(微服务场景)
- ✅ 验证是否生效
- 常见问题排查
- ✅ 小结
在 Spring Boot 项目中整合 Seata(分布式事务框架),可以实现跨服务、跨数据库的分布式事务管理。Seata 提供了多种模式,如 AT、TCC、Saga、XA 等,其中 AT 模式 是最常用的一种,它通过代理数据源和全局事务日志(undo_log)来实现自动回滚。
下面介绍 Spring Boot 整合 Seata(AT 模式) :
前提条件
- 已安装并启动 Seata Server
- 数据库支持:mysql / oracle / PostgreSQL 等
- Spring Boot 项目使用 MyBATis / JPA / JDBC
- 使用 Dubbo 或 Spring Cloud Alibaba 微服务架构
✅ 一:搭建 Seata Server(TC)
1. 下载 Seata Server
前往 Seata github Releases 下载最新版本。
例如:
wget https://github.com/seata/seata/releases/download/v2.0.0/seata-server-2.0.0.zip
2. 配置registry.conf和file.conf
修改 registry.conf(注册中心)
如果你用的是 Nacos 注册中心,配置如下:
registry { type = "nacos" nacos { server-addr = "127.0.0.1:8848" namespace = "" group = "DEFAULT_GROUP" } } config { type = "nacos" nacos { server-addr = "127.0.0python.1:8848" namespace = "" group = "SEATA_GROUP" data-id = "seataServer.properties" } }
3. 启动 Seata Server
cd seata/bin ./seata-server.sh -p 8091 -m file
注意:Windows 用户执行 seata-server.bat
✅ 二:配置数据库(undo_log 表)
每个参与分布式事务的数据库都需要创建 undo_log
表:
-- MySQL 示例 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_jsstatus` INT(11) NOT NULL, `log_created` DATETIME NOT NULL, `log_modified` DATETIME NOT NULL, `ext` VARCHAR(100) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
✅ 三:Spring Boot 项目整合 Seata
1. 添加依赖(Maven)
<!-- Spring Boot Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MyBatis Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> <!-- MySQL 驱动 --> <dependency> <groupId>mysql</groupId> <apythonrtifactId>mysql-connector-Java</artifactId> </dependency> <!-- Seata Starter --> <dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> </dependency> <!-- Nacos Discovery(可选) --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
2. 配置 application.yml
server: port: 8081 spring: application: name: order-service datasource: url: jdbc:mysql://localhost:3306/order_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver # 使用 Seata 数据源代理 type: io.seata.rm.datasource.SeataDataSourceProxy # Seata 配置 seata: enabled: true application-id: ${spring.application.name} # 应用唯一ID tx-service-group: my_test_tx_group # 事务组名(与 TC 配置一致) service: vgroup-mapping: my_test_tx_group: default # 映射事务组到默认集群 grouplist: default: 127.0.0.1:8091 # TC 地址(仅测试环境需要) config: type: nacos # 配置中心类型 nacos: server-addr: 127.0.0.1:8848 group: SEATA_GROUP data-id: seataServer.properties registry: type: nacos # 注册中心类型 nacos: server-addr: 127.0.0.1:8848
3. 编写业务代码
Service 层添加 @GlobalTransactional 注解
import io.seata.spring.annotation.GlobalTransactional; import org.springframework.stereotype.Service; @Service public class OrderService { @GlobalTransactional(name = "create-order", rollbackFor = Exception.class) public void createOrder() throws Exception { // 调用库存服务扣减库存(RPC) stockService.decreaseStock(); // 插入订单 orderMapper.insert(new Order(...)); // 模拟异常触发回滚 if (true) { throw new RuntimeException("模拟失败"); } } }
4. 启动类
@SpringBootApplication public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } }
✅ 四:多服务协同调用(微服务场景)
- 所有服务都引入
seata-spring-boot-starter
- 所有服务都要配置相同的
tx-service-group
- 在 Fei编程客栈gn/RPC 调用时,Seata 会自动传播 XID,实现全局事务控制
✅ 验证是否生效
- 查看日志中是否有
xid=xxx
输出 - 触发异常后,检查各服务数据库是否回滚
- 查看 Seata Server 控制台日志
常见问题排查
问题 | 解决方案 |
---|---|
无法连www.devze.com接 TC | 检查 Seata Server 是否启动,配置的 IP/端口是否正确 |
未找到 undo_log 表 | 检查数据库是否已创建该表 |
分布式事务不生效 | 检查是否开启 @GlobalTransactional ,是否使用 Seata 数据源代理 |
多个服务之间 XID 不一致 | 检查 Feign/RPC 是否开启拦截器,或是否遗漏 Seata 配置 |
✅ 小结
步骤 | 内容 |
---|---|
1 | 安装并启动 Seata Server |
2 | 创建 undo_log 表 |
3 | 引入依赖、配置数据源、添加注解 |
4 | 多服务协调调用,验证事务一致性 |
到此这篇关于Spring Boot整合Seata的过程详解(AT 模式)的文章就介绍到这了,更多相关springboot整合seata内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论