前言:微服务架构最大的数据一致性难题就是分布式事务。单体项目中,我们依靠@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%启动报错:
-
MySQL中已创建
seata_server数据库,并执行完全局/分支/锁三张数据表SQL; -
Nacos已正常启动(8848端口监听正常);
-
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 启动成功校验(三步落地验证)
-
端口校验:7091端口正常监听,无端口占用报错;
-
日志校验:logs目录无ERROR错误日志,打印register to nacos success;
-
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 测试前置准备
-
启动本地MySQL,提前创建业务库并执行上文 undo_log 回滚日志表SQL;
-
启动Nacos服务(8848),控制台确认服务正常运行;
-
启动Seata服务端,Nacos服务列表确认
seata-server注册成功; -
启动seata-stock-service库存服务、seata-order-service订单服务;
-
Nacos服务列表校验两个微服务注册成功,无异常报错,环境就绪。
7.2 场景一:事务异常全局回滚(核心测试)
-
保持代码中
int num = 1 / 0;异常代码不注释; -
浏览器/Postman访问接口:
http://localhost:端口/order/create; -
观察控制台:订单创建、库存扣减执行完成后抛出异常;
-
Seata感知异常,触发全局事务回滚,undo_log日志自动生成并清理;
-
结果验证:所有分支业务全部回滚,无脏数据,事务保持原子性。
7.3 场景二:事务正常全局提交
-
注释掉模拟异常代码
// int num = 1 / 0;; -
重新访问测试接口;
-
所有业务正常执行,无异常;
-
Seata全局事务提交,异步清理undo_log日志;
-
结果验证:订单、库存业务全部生效,事务执行成功。
八、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全家桶技术体系。

3083

被折叠的 条评论
为什么被折叠?



