seata 零基础入门实战

前言:微服务架构最大的数据一致性难题就是分布式事务。单体项目中,我们依靠@Transactional 即可保证数据库事务原子性,要么全部成功、要么全部回滚。但微服务拆分后,一次业务操作会跨多个服务、多个数据库,本地事务彻底失效,极易出现部分成功、部分失败、数据脏写、数据不一致问题,引发资损、业务异常。

Seata 是阿里开源、Apache 顶级开源的一站式高性能分布式事务解决方案,彻底解决微服务跨库、跨服务事务一致性问题,是 Spring Cloud Alibaba 体系中解决分布式事务的行业标准组件。本文从零搭建全套运行环境,包含Seata服务端部署、Nacos联动配置、客户端完整代码、步骤化测试、原理详解、优缺点、生产实践与适用场景,全程可直接复刻运行,风格统一适配微服务全家桶系列博客。

一、Seata 技术背景与发展历程

1.1 为什么必须用分布式事务?

微服务拆分后,业务链路被拆解为多个独立服务,每个服务独立数据库,本地事务无法跨服务生效。经典电商下单场景:创建订单(订单服务) → 扣减库存(库存服务) → 扣减余额(账户服务)

若前两个服务执行成功,最后扣减余额异常,会出现订单生成、库存减少、用户余额未扣的数据不一致问题,直接造成平台资损、脏数据堆积,是生产环境绝对无法容忍的问题。

1.2 传统分布式事务方案缺陷

在Seata出现之前,行业主流分布式事务方案均存在明显短板,无法适配微服务高并发、低侵入、易维护的核心需求:

  • 原生XA(2PC):强一致性但性能极差、长事务阻塞数据库,完全不适合高并发微服务场景;

  • 手写TCC补偿:代码侵入极高、开发成本巨大,每个业务需单独实现Try/Confirm/Cancel,无通用性;

  • 本地消息表:业务与事务逻辑强耦合,需维护额外消息表,状态机复杂,最终一致性保障弱;

  • RabbitMQ可靠消息:强依赖MQ中间件、事务延迟高,仅适配非实时最终一致场景,无法满足金融、交易类强一致需求。

1.3 Seata 发展与核心定位

Seata 源自阿里双十一高并发分布式事务实战打磨,专为微服务架构设计,核心目标:低侵入、高性能、易落地、多场景适配。目前支持 AT、TCC、SAGA、XA 四大事务模式,全覆盖高并发、长事务、强一致、老旧系统兼容场景,是国内微服务分布式事务唯一主流标准化解决方案,无缝适配Spring Cloud Alibaba全套生态。

二、Seata 核心架构与三大核心角色

Seata 采用经典的协调器+客户端架构,整体由 TC、TM、RM 三大核心组件协同工作,所有分布式事务的开启、注册、提交、回滚均由三者联动完成。

2.1 TC(Transaction Coordinator 事务协调器)

独立部署的Seata Server服务端,是全局事务的调度中枢与核心管控节点,全局唯一。核心职责:

  • 统一维护全局事务、分支事务的状态、生命周期;

  • 接收TM的全局事务开启、提交、回滚指令;

  • 调度所有RM分支事务,实现统一提交或统一回滚;

  • 支持事务日志持久化、集群高可用、故障恢复,保障事务可靠性。

2.2 TM(Transaction Manager 事务管理器)

嵌入在业务发起方微服务中的客户端组件,是全局事务的创建者与终结者。核心职责:

  • 向TC申请开启全局事务,生成全局唯一事务ID(XID);

  • 业务链路执行完毕后,根据执行结果通知TC全局提交或全局回滚。

2.3 RM(Resource Manager 资源管理器)

嵌入在所有参与分布式事务的微服务中,是分支事务的实际执行者。核心职责:

  • 向TC注册本地分支事务,关联全局XID;

  • 拦截业务SQL,记录事务快照与回滚日志;

  • 接收TC调度指令,执行分支事务提交或回滚操作。

2.4 完整事务调用链路

TM开启全局事务生成XID → 所有微服务RM注册分支事务 → 各服务执行业务SQL → 全部成功则TC调度全局提交 / 任意分支异常则TC调度全局回滚

三、Seata 四大事务模式详解(核心重点)

3.1 AT 模式(Auto Transaction 自动事务·生产首选)

定位:Seata默认模式、零业务侵入、性能接近本地事务、适配90%以上微服务高并发场景,企业落地主流方案。

3.1.1 两阶段核心原理

第一阶段(执行阶段):RM自动拦截业务SQL,解析数据库数据前后镜像,生成并写入 undo_log 回滚日志,执行本地业务SQL并提交本地事务,同时占用全局行锁,无需阻塞等待。

第二阶段(决议阶段):根据全局事务结果执行不同逻辑:

  • 全局成功:TC下发提交指令,RM异步清理undo_log日志、释放全局锁,性能极高;

  • 全局失败:TC下发回滚指令,RM解析undo_log镜像,反向生成回滚SQL,精准恢复事务前数据状态,杜绝脏数据。

核心特点:业务零改造、无需手动补偿、无人工代码侵入、高并发友好、隔离性可控。

3.2 TCC 模式(手动补偿模式)

定位:高自定义、强可控、适配非数据库事务、复杂特殊业务场景。

需开发者手动实现三段式接口,完全脱离数据库本地事务,纯代码实现事务补偿:

  • Try(资源校验/锁定):检查业务资源、锁定资源,完成预执行业务;

  • Confirm(确认提交):全局事务成功,确认执行业务、释放锁定资源;

  • Cancel(回滚补偿):全局事务失败,撤销Try操作、释放资源、数据回滚。

优缺点:可控性最强、适配特殊场景;代码侵入极高、开发维护成本大。

3.3 SAGA 模式(长事务模式)

定位:适配长耗时、长链路、异步化事务场景,无锁、最终一致性。

核心原理:为每一个正向业务接口配置对应的反向补偿接口,事务链路执行异常时,逆向依次执行补偿逻辑,回滚整条链路数据,适用于订单履约、流程审批、超时关闭等长事务场景。

3.4 XA 模式(原生强一致模式)

定位:兼容数据库原生XA二阶段协议,强一致性、无脏数据。

核心缺陷:事务全程阻塞、数据库锁持有时间长、性能极低,完全不适合高并发微服务,仅用于老旧传统项目兼容改造。

四、Seata 优缺点全面总结

4.1 核心优点

  • 极低业务侵入:AT模式仅需一行全局事务注解,无需改动核心业务代码;

  • 高性能高并发:一阶段本地事务立即提交,二阶段异步清理,性能无限接近本地事务;

  • 全场景覆盖:四大事务模式适配高并发、长事务、强一致、老旧系统各类场景;

  • 生态无缝适配:完美整合Nacos、Gateway、Sentinel、OpenFeign全套Spring Cloud Alibaba生态;

  • 生产高可用:支持DB/Redis/Raft事务持久化、TC集群部署,杜绝单点故障;

  • 工业级稳定:经过阿里双十一亿级流量验证,社区活跃、企业落地成熟。

4.2 核心缺点

  • AT模式存在经典问题:存在空回滚、悬挂、重复执行风险,需通过配置与机制规避;

  • 强依赖TC节点:TC服务故障会导致分布式事务无法正常执行,需集群保障;

  • AT模式隔离性有限:存在全局行锁竞争,超高并发场景需针对性优化;

  • TCC/SAGA成本高:需手动编写补偿逻辑,开发与维护成本远高于AT模式。

五、全套运行环境搭建(服务端+数据库+配置)

本节搭建可直接生产使用的完整Seata运行环境,包含Nacos依赖、Seata服务端部署、数据库初始化、服务端配置,全程无遗漏。

5.1 全套前置环境搭建(Nacos+基础环境,从零落地)

本文所有实战内容无需任何前置环境,本节手把手完成 Nacos 服务端搭建、初始化配置、环境校验,搭配后续 Seata 部署,实现整套分布式事务环境从零搭建、可直接用于开发与测试。

5.1.1 基础软件版本规范(统一落地版本)

为避免版本报错、兼容问题,统一使用稳定生产版本,与Spring Cloud Alibaba生态完美适配:

  • JDK:17(企业通用稳定版)

  • Maven:3.6+

  • MySQL:8.0+(支持undo_log大字段、事务日志存储)

  • Nacos:2.5.2

  • Seata:2.0.0

5.1.2 Nacos服务端下载与启动

Nacos作为注册中心+配置中心,是Seata服务注册、客户端联动的核心依赖,必须优先搭建。

1、下载安装包:Nacos官网下载 nacos-server-2.5.3.zip,解压至纯英文无空格目录。下载路径:https://github.com/alibaba/nacos/releases/tag/v2.5.3

2、启动Nacos(单机模式,必选):禁止集群启动,新手统一单机测试。

  • Windows:进入 nacos/bin,执行 startup.cmd -m standalone

  • Linux/Mac:执行 sh startup.sh -m standalone

3、访问控制台:浏览器打开 http://localhost:8848/nacos

默认账号密码:nacos / nacos(提示密码错误可以查看控制台密码信息)

5.1.3 Nacos环境校验(关键落地步骤)

启动完成后必须校验,避免后续Seata、微服务注册失败:

  • 访问控制台正常登录,无报错;

  • 端口8848正常监听,无端口占用冲突;

  • 默认命名空间 public 存在(Seata默认绑定此命名空间)。

5.1.4 Nacos核心配置(适配Seata)

无需额外复杂配置,保持默认即可,核心适配规则:

  • 关闭认证(本地测试环境),避免服务注册鉴权失败;

  • 保留默认端口8848,全文所有配置统一复用此端口;

  • 事务分组、服务注册全部挂载 public 命名空间,统一环境隔离。

环境落地结论:Nacos搭建完成后,后续Seata服务端、订单服务、库存服务均可自动完成注册与发现,实现分布式联动。

也可以使用官网提供的一键安装脚本:官网地址:Nacos Server 下载 | Nacos 官网

powershell -NoProfile -ExecutionPolicy Bypass -Command "iwr -UseBasicParsing https://nacos.io/nacos-installer.ps1 | iex"

使用官网的一键安装脚本默认安装最新版本,需要使用下列脚本设置为对应的版本,不要使用上面的一键安装脚本

nacos-setup -v 2.5.3

安装完成之后启动方式与上述一致,但是脚本安装的登录密码不是默认的nacos,得修改conf/application.properties的配置信息:

# 开启鉴权
nacos.core.auth.enabled=true
nacos.core.auth.system.type=nacos

# 服务内部通信密钥(必须成对填写,自定义即可)
nacos.core.auth.server.identity.key=nacos
nacos.core.auth.server.identity.value=nacos

# JWT token密钥(不要使用默认值,复制下面这段)
nacos.core.auth.plugin.nacos.token.secret.key=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=

# 【关键】预置管理员账号,明文nacos自动BCrypt匹配
nacos.core.auth.default.username=nacos
nacos.core.auth.default.password=$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuSwc2TlQxOqnJRtXG.O

5.2 数据库初始化(生产必备,从零执行)

5.2 数据库初始化(生产必备)

需要初始化服务端事务库业务库回滚日志表两套SQL,缺一不可。

5.2.1 Seata服务端数据库(seata_server)

CREATE DATABASE IF NOT EXISTS seata_server DEFAULT CHARSET utf8mb4;
USE seata_server;

-- Seata服务端事务日志、分支、全局事务表
CREATE TABLE global_table (
  xid VARCHAR(128) NOT NULL,
  transaction_id BIGINT,
  status TINYINT NOT NULL,
  application_id VARCHAR(32),
  transaction_group VARCHAR(32),
  transaction_name VARCHAR(128),
  timeout INT,
  begin_time BIGINT,
  begin_timestamp BIGINT,
  end_time BIGINT,
  end_timestamp BIGINT,
  server_addr VARCHAR(128),
  client_ip VARCHAR(128),
  retry INT,
  PRIMARY KEY (xid),
  KEY idx_status (status),
  KEY idx_transaction_id (transaction_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE branch_table (
  xid VARCHAR(128) NOT NULL,
  branch_id BIGINT NOT NULL,
  transaction_id BIGINT,
  resource_group_id VARCHAR(32),
  resource_id VARCHAR(256),
  branch_type TINYINT,
  status TINYINT,
  client_ip VARCHAR(128),
  application_id VARCHAR(32),
  gmt_create DATETIME,
  gmt_modified DATETIME,
  PRIMARY KEY (xid,branch_id),
  KEY idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE lock_table (
  row_key VARCHAR(128) NOT NULL,
  xid VARCHAR(128),
  transaction_id BIGINT,
  branch_id BIGINT,
  resource_id VARCHAR(256),
  table_name VARCHAR(32),
  pk VARCHAR(128),
  gmt_create DATETIME,
  gmt_modified DATETIME,
  PRIMARY KEY (row_key),
  KEY idx_xid (xid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

5.2.2 业务库回滚日志表(每个业务库都需执行)

CREATE TABLE IF NOT EXISTS undo_log (
  id BIGINT NOT NULL AUTO_INCREMENT,
  branch_id BIGINT NOT NULL,
  xid VARCHAR(128) NOT NULL,
  context VARCHAR(128) NOT NULL,
  rollback_info LONGBLOB NOT NULL,
  log_status INT NOT NULL,
  log_created DATETIME NOT NULL,
  log_modified DATETIME NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY ux_undo_log (xid,branch_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

5.3 Seata服务端完整部署与精细化配置(从零落地·超详细)

本节为生产级完整版Seata服务端部署教程,包含精准版本下载、目录结构说明、核心配置文件路径、全量参数配置、Nacos联动、DB持久化开启、启动校验,所有步骤、文件路径、配置参数1:1可复刻,解决新手配置报错、注册失败、事务不持久化等问题。

5.3.1 版本选择与官方下载(固定稳定版)

统一使用生产稳定版本:Seata 2.6.0,完美适配 Nacos2.5.3、Spring Cloud Alibaba 主流版本,无兼容BUG。

官方下载地址https://dlcdn.apache.org/incubator/seata/2.6.0/apache-seata-2.6.0-incubating-bin.tar.gz

下载文件:seata-server-2.0.0.zip(Windows/Linux通用压缩包)

解压规范:解压至 纯英文、无空格、无中文 目录,示例:D:\software\seata-2.6.0

5.3.2 Seata服务端核心目录结构说明

解压后核心目录仅需关注以下路径,所有配置、启动、日志均在此范围内:

  • seata-2.6.0/conf/ 【核心配置目录】:存放所有服务端配置文件

  • seata-2.6.0/conf/file.conf:事务存储、数据源、超时核心配置

  • seata-2.6.0/bin/:启动脚本目录

  • seata-2.6.0/logs/:日志目录,排查启动报错、事务异常专用

5.3.3 第一核心配置:application.yml(注册&配置中心)

文件绝对路径Seata根目录/conf/registry.conf

作用:配置Seata服务端注册到Nacos、从Nacos读取配置,是客户端与服务端联动的核心,配置错误直接导致服务注册失败、事务失效。

完整可直接复制配置(适配本地Nacos)

server:
  port: 7091

spring:
  application:
    name: seata-server

logging:
  config: classpath:logback-spring.xml
  file:
    path: ${log.home:${user.home}/logs/seata}
  extend:
    logstash-appender:
      destination: 127.0.0.1:4560
    kafka-appender:
      bootstrap-servers: 127.0.0.1:9092
      topic: logback_to_logstash

console:
  user:
    # seata的登录账号
    username: seata
    password: seata
seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      group: SEATA_GROUP
      #nacos的登录账号
      username: nacos
      password: nacos
  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      group: SEATA_GROUP
      username: nacos
      password: nacos
  store:
    # support: file 、 db 、 redis 、 raft
    mode: db

关键配置释义

  • 必须保证服务端、客户端 namespace、cluster、serverAddr 完全一致,否则无法通信;

  • 本地测试禁止修改自定义命名空间,统一使用public。

5.3.4 第二核心配置:file.conf(事务存储&数据源)

文件绝对路径Seata根目录/conf/file.conf

作用:配置事务持久化模式、数据库连接、事务超时、锁机制,生产必须改为DB模式,默认内存模式重启丢失所有事务数据。

完整可直接复制配置(生产DB持久化模式)

# 事务存储模式:file-文件  db-数据库  redis-缓存
store.mode=db

# 关闭异步存储,保证事务可靠
store.async.discard-branch-log=false

# DB数据源配置(对接前面创建的seata_server库)
store.db.datasource=druid
store.db.db-type=mysql
# MySQL8.0固定驱动
store.db.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据库地址、库名、时区必须完整配置
store.db.url=jdbc:mysql://127.0.0.1:3306/seata_server?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&allowMultiQueries=true
# 你的数据库账号密码
store.db.user=root
store.db.password=123456

# 数据库连接池参数
store.db.min-conn=5
store.db.max-conn=100
store.db.max-wait=3000

# 事务超时、重试配置
service.transaction-group=default_tx_group
service.disable-global-transaction=false
service.default-timeout=60000

核心参数重点说明

  • store.mode=db:开启数据库持久化,生产唯一可用模式,重启服务事务不丢失;

  • service.transaction-group=default_tx_group:事务分组名称,必须与客户端yml配置完全一致

  • 数据库URL必须携带 serverTimezone,否则MySQL8.0直接报错无法启动。

5.3.5 环境前置校验(启动前必做)

修改完配置后,启动前必须校验以下3项,规避90%启动报错:

  1. MySQL中已创建 seata_server 数据库,并执行完全局/分支/锁三张数据表SQL;

  2. Nacos已正常启动(8848端口监听正常);

  3. file.conf中数据库账号密码与本地MySQL完全一致、数据库可正常连接。

5.3.6 Seata服务端启动步骤(Windows/Linux双适配)

启动脚本路径Seata根目录/bin/

  • Windows系统:双击执行 seata-server.bat

  • Linux/Mac系统:终端执行 sh seata-server.sh

自定义启动参数(可选):默认端口7091,如需修改可启动时指定

# 指定端口、IP、集群启动
sh seata-server.sh -p 7091 -h 127.0.0.1 -m db

Window系统下,通过seata-server.bat启动的时候会报无web容器的问题,需要在bat文件中在%JAVACMD%命令后面添加-Dspring.main.web-application-type=NONE,再通过seata-server.bat 启动

5.3.7 启动成功校验(三步落地验证)

  1. 端口校验:7091端口正常监听,无端口占用报错;

  2. 日志校验:logs目录无ERROR错误日志,打印register to nacos success;

  3. Nacos控制台校验(最核心):进入Nacos服务管理-服务列表,出现 seata-server 服务,在线实例正常,代表服务端部署+Nacos联动完全成功。

5.3.8 服务端默认核心参数汇总(对接客户端必备)

  • Seata服务端口:7091

  • 默认事务分组:default_tx_group

  • 默认集群名称:default

  • 默认命名空间:public

  • 存储模式:DB持久化(生产模式)

六、微服务客户端完整实战代码

搭建订单服务+库存服务双服务测试场景,通过OpenFeign远程调用,实现跨服务分布式事务一致性。

6.1 项目核心依赖(所有参与事务服务引入)

<!--使用最新的seata引入方式,旧版的alibaba已经不维护 -->
<dependency>
     <groupId>org.apache.seata</groupId>
     <artifactId>seata-spring-boot-starter</artifactId>
     <version>2.6.0</version>
</dependency>
<!-- Nacos注册中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>                                  <version>2025.0.0.0</version>
</dependency>
<!-- OpenFeign远程调用 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2025.0.0</version>
</dependency>
<!-- Web核心依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

6.2 客户端统一配置(application.yml)

6.2 客户端统一配置(application.yml,Nacos+Seata联动完整版)

该配置为生产级动态多数据源适配Seata完整配置,彻底替代原生单数据源,支持多数据源切换、自动代理数据源、自动生成undo_log回滚日志,兼容Seata AT模式,无需手动改造代码,仅修改服务名、数据源信息即可直接落地。

spring:
  application:
    name: service-order
  # 动态多数据源配置(dynamic-datasource 核心)
  datasource:
    dynamic:
      primary: master          # 默认主库
      strict: true             # 严格模式,找不到数据源直接抛异常
      atomikos:
        enabled: false          # ✅开启Atomikos XA分布式事务!
        unique-resource-name-prefix: db-
        local-transaction-mode: false # ❗必须false,开启XA全局事务
      datasource:
        master:
          url: jdbc:mysql://172.17.0.1:3306/db_name?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai
          username: root
          password: 你的数据库密码
          driver-class-name: com.mysql.cj.jdbc.Driver
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        enabled: true
        # 本机开发推荐开启,自动使用本机IP注册
        prefer-ip-address: true
        # 新增 nacos登录账号密码
        username: nacos
        password: nacos
      config:
        server-addr: 127.0.0.1:8848
        enabled: false # 暂时不用nacos配置中心,关闭避免额外连接报错
        # 新增 nacos登录账号密码
        username: nacos
        password: nacos
seata:
  enabled: true
  #使用对应配套的dynamic建议开启自动代理,手动创建datasource会有循环嵌套引用问题
  enable-auto-data-source-proxy: true
  application-id: ${spring.application.name}
  tx-service-group: default_tx_group
  service:
    vgroupMapping:
      default_tx_group: default
  registry:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      username: nacos
      password: nacos
      namespace: public
	  #与seata服务注册时填写的nacos注册服务要一致,要不然会因为找不到对应服务导致启动失败
      group: SEATA_GROUP
# ⚠️ 重点!全部注释config节点,不要开启seata config nacos 使用注册方式就不用使用config,要不然会因为双重启动方式导致系统配置读取异常,启动失效
# config:
#   type: nacos
#   nacos:
#     server-addr: 127.0.0.1:8848
#     username: nacos
#     password: nacos

核心适配说明(动态数据源专属)

  • enable-auto-data-source-proxy: true:Seata自动拦截 dynamic-datasource 所有数据源SQL,自动生成undo_log回滚日志,无需手动注入数据源;

  • 多数据源场景下,所有数据源自动纳入Seata分布式事务管控,跨数据源、跨服务事务均可保证原子性;

  • 保留dynamic-datasource原生所有特性:数据源切换、读写分离、多库隔离,同时兼容Seata AT事务;

  • 每个业务数据库仍需提前执行 undo_log 回滚日志表SQL,保证回滚正常生效。

6.3 启动类配置

使用dynamic-datasource必须排除原生数据源自动配置,防止与动态数据源冲突,启动类完整配置如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

// 排除原生DataSource自动配置,适配dynamic-datasource
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.cfm.micro_common.foreign")
@MapperScan("com.cfm.micro_order.mapper")
public class SeataOrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(SeataOrderApplication.class, args);
    }
}

6.4 库存服务接口(被调用方)

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class StockController {

    // 扣减库存接口
    @GetMapping("/stock/deduct")
    public String deductStock(){
        // 模拟库存扣减业务
        System.out.println("库存扣减成功");
        return "库存扣减成功";
    }
}

6.5 Feign远程调用接口

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient("seata-stock-service")
public interface StockFeignClient {

    @GetMapping("/stock/deduct")
    String deductStock();
}

6.6 订单服务事务核心业务(全局事务注解)

import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;

@Service
public class OrderService {

    @Resource
    private StockFeignClient stockFeignClient;

    // 开启全局分布式事务:捕获所有异常触发全局回滚
    @GlobalTransactional(rollbackFor = Exception.class)
    public void createOrder(){
        // 1. 模拟创建订单业务
        System.out.println("订单创建成功");

        // 2. 远程调用库存服务扣减库存
        stockFeignClient.deductStock();

        // 3. 模拟业务异常,触发分布式事务回滚
        int num = 1 / 0;
    }
}

6.7 测试接口Controller

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;

@RestController
public class OrderController {

    @Resource
    private OrderService orderService;

    @GetMapping("/order/create")
    public String createOrder(){
        orderService.createOrder();
        return "下单成功";
    }
}

以上只是抽取核心流程的伪代码,具体的实现方式需要自己根据要求去实现

七、全套步骤化测试流程(可直接复刻)

严格按照以下步骤测试,完整验证分布式事务成功提交异常回滚两大核心场景。

7.1 测试前置准备

  1. 启动本地MySQL,提前创建业务库并执行上文 undo_log 回滚日志表SQL;

  2. 启动Nacos服务(8848),控制台确认服务正常运行;

  3. 启动Seata服务端,Nacos服务列表确认seata-server 注册成功;

  4. 启动seata-stock-service库存服务、seata-order-service订单服务;

  5. Nacos服务列表校验两个微服务注册成功,无异常报错,环境就绪。

7.2 场景一:事务异常全局回滚(核心测试)

  1. 保持代码中 int num = 1 / 0; 异常代码不注释;

  2. 浏览器/Postman访问接口:http://localhost:端口/order/create

  3. 观察控制台:订单创建、库存扣减执行完成后抛出异常;

  4. Seata感知异常,触发全局事务回滚,undo_log日志自动生成并清理;

  5. 结果验证:所有分支业务全部回滚,无脏数据,事务保持原子性。

7.3 场景二:事务正常全局提交

  1. 注释掉模拟异常代码 // int num = 1 / 0;

  2. 重新访问测试接口;

  3. 所有业务正常执行,无异常;

  4. Seata全局事务提交,异步清理undo_log日志;

  5. 结果验证:订单、库存业务全部生效,事务执行成功。

八、Seata 生产核心问题与解决方案

8.1 AT模式三大经典问题及规避方案

  • 空回滚:分支事务未执行业务,但收到TC回滚指令;解决方案:通过分支状态校验、本地事务锁拦截空回滚,Seata新版已默认优化;

  • 悬挂:二阶段回滚请求先于一阶段业务执行;解决方案:事务超时控制、请求时序校验,杜绝悬挂问题;

  • 幂等性:防止重复提交、重复回滚;解决方案:Seata原生支持分支事务幂等校验,自动过滤重复请求。

8.2 生产最佳实践

  • Seata服务端必须开启DB持久化+集群部署,彻底杜绝TC单点故障;

  • 全局事务注解统一使用 @GlobalTransactional(rollbackFor = Exception.class),捕获所有异常;

  • 纯查询、只读接口禁止添加全局事务,减少锁竞争、提升集群吞吐量;

  • 合理配置事务超时时间,避免长事务占用数据库锁,引发业务阻塞;

  • 对接日志监控与告警,实时监控事务失败、回滚、超时异常,快速排查数据不一致问题。

九、Seata 适用场景

  • 微服务跨库事务场景:下单、支付、库存、积分、账户联动业务,保障数据强一致性;

  • 电商高并发场景:秒杀、大促、限时活动,依托AT模式高性能特性支撑海量并发事务;

  • 金融支付场景:资金流转、账单记录、账户变动,杜绝资损与脏数据;

  • 长链路异步场景:订单履约、流程审批、超时关闭,使用SAGA模式适配长事务;

  • 老旧系统改造场景:兼容XA模式、自定义TCC补偿,适配传统项目微服务改造。

十、全文总结

1. Seata 是微服务架构下分布式事务唯一通用、高性能、低侵入的标准化解决方案,彻底解决微服务拆分后的跨服务、跨库数据一致性难题。

2. 核心架构由 TC协调器、TM事务发起者、RM资源执行者组成,通过两阶段提交机制,在保证高性能的同时实现事务原子性。

3. AT模式是90%生产场景的首选,零业务侵入、性能优异;TCC、SAGA、XA分别适配特殊复杂、长事务、老旧系统兼容场景。

4. 本文提供全套可复刻运行环境,包含服务端部署、数据库脚本、客户端完整代码、步骤化测试流程,可直接落地到企业微服务项目,完美适配Spring Cloud Alibaba全家桶技术体系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值