当前位置: 代码网 > it编程>编程语言>Java > Spring Boot整合Seata的过程详解(AT 模式)

Spring Boot整合Seata的过程详解(AT 模式)

2025年10月10日 Java 我要评论
在 spring boot 项目中整合 seata(分布式事务框架),可以实现跨服务、跨数据库的分布式事务管理。seata 提供了多种模式,如 at、tcc、saga、xa 等,其中 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: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
  • 在 feign/rpc 调用时,seata 会自动传播 xid,实现全局事务控制

✅ 验证是否生效

  1. 查看日志中是否有 xid=xxx 输出
  2. 触发异常后,检查各服务数据库是否回滚
  3. 查看 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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com