Spring Boot整合Seata的过程详解(AT 模式)
在 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.0.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_status` 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>
<artifactId>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:88483. 编写业务代码
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 - 在 Feign/RPC 调用时,Seata 会自动传播 XID,实现全局事务控制
✅ 验证是否生效
- 查看日志中是否有
xid=xxx输出 - 触发异常后,检查各服务数据库是否回滚
- 查看 Seata Server 控制台日志
📌 常见问题排查
| 问题 | 解决方案 |
|---|---|
| 无法连接 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
剖析Java中在Collection集合中使用contains和remove为什么要重写equals
这篇文章主要介绍了Collection集合的contains和remove方法详解remove以及相关的经验技巧,通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下2021-09-09
SpringBoot整合Gson 整合Fastjson的实例详解
这篇文章主要介绍了SpringBoot整合Gson 整合Fastjson的实例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-11-11
最新IntelliJ IDEA 2021版配置 Tomcat 8.5 的详细步骤
idea开发工具一直是java环境最好用,很受广大开发者喜爱,今天通过本文给大家分享最新IntelliJ IDEA 2021版配置 Tomcat 8.5 的详细步骤,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下2021-06-06
MyBatisPlus TypeHandler自定义字段类型转换Handler
这篇文章主要为大家介绍了MyBatisPlus TypeHandler自定义字段类型转换Handler示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-08-08
springboot 2.0 mybatis mapper-locations扫描多个路径的实现
这篇文章主要介绍了springboot 2.0 mybatis mapper-locations扫描多个路径的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-07-07


最新评论