news 2026/3/8 6:12:31

Seata1.7.0的安装和使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Seata1.7.0的安装和使用

文章目录

  • 前言
  • 5. Seata快速开始
    • Seata Server(服务端)(TC)环境搭建
      • 下载安装包
      • Server端存储模式(store.mode)支持三种:
      • 创建数据库seata_server,导入数据库文件
      • 修改application.yml文件
      • 修改config.txt文件
      • 修改nacos-config.sh文件
      • 启动seata服务
    • Seata Client(客户端)搭建
      • 创建undo_log表。
      • 引入pom文件
      • 引入配置文件
      • 启动项目查看是否连接成功
  • 6. 项目中的使用
    • 患者下单的service
    • 库存service
      • api
      • api实现
    • 查看是否回滚
    • 失败的原因

前言

如果你还对seata没有什么概念可以看我之前的文章===> Seata1.7.0版本分布式事务介绍

本篇接着上篇的讲解

5. Seata快速开始

https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html 官网文档

Seata Server(服务端)(TC)环境搭建

下载安装包

https://github.com/seata/seata/releases 下载1.7.0版本

Server端存储模式(store.mode)支持三种:

  • file:(默认)单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高(默认)
  • db:(5.7+)高可用模式,全局事务会话信息通过db共享,相应性能差些
  • redis: Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置适合当前场景的redis持久化配置

我们这里使用db(数据库存储)所以接下来就去导入相关表

创建数据库seata_server,导入数据库文件

打开seata\script\server\db文件夹下的mysql.sql文件。内容如下。

-- -------------------------------- The script used when storeMode is 'db' ---------------------------------- the table to store GlobalSession dataCREATETABLEIFNOTEXISTS`global_table`(`xid`VARCHAR(128)NOTNULL,`transaction_id`BIGINT,`status`TINYINTNOTNULL,`application_id`VARCHAR(32),`transaction_service_group`VARCHAR(32),`transaction_name`VARCHAR(128),`timeout`INT,`begin_time`BIGINT,`application_data`VARCHAR(2000),`gmt_create`DATETIME,`gmt_modified`DATETIME,PRIMARYKEY(`xid`),KEY`idx_status_gmt_modified`(`status`,`gmt_modified`),KEY`idx_transaction_id`(`transaction_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;-- the table to store BranchSession dataCREATETABLEIFNOTEXISTS`branch_table`(`branch_id`BIGINTNOTNULL,`xid`VARCHAR(128)NOTNULL,`transaction_id`BIGINT,`resource_group_id`VARCHAR(32),`resource_id`VARCHAR(256),`branch_type`VARCHAR(8),`status`TINYINT,`client_id`VARCHAR(64),`application_data`VARCHAR(2000),`gmt_create`DATETIME(6),`gmt_modified`DATETIME(6),PRIMARYKEY(`branch_id`),KEY`idx_xid`(`xid`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;-- the table to store lock dataCREATETABLEIFNOTEXISTS`lock_table`(`row_key`VARCHAR(128)NOTNULL,`xid`VARCHAR(128),`transaction_id`BIGINT,`branch_id`BIGINTNOTNULL,`resource_id`VARCHAR(256),`table_name`VARCHAR(32),`pk`VARCHAR(36),`status`TINYINTNOTNULLDEFAULT'0'COMMENT'0:locked ,1:rollbacking',`gmt_create`DATETIME,`gmt_modified`DATETIME,PRIMARYKEY(`row_key`),KEY`idx_status`(`status`),KEY`idx_branch_id`(`branch_id`),KEY`idx_xid`(`xid`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;CREATETABLEIFNOTEXISTS`distributed_lock`(`lock_key`CHAR(20)NOTNULL,`lock_value`VARCHAR(20)NOTNULL,`expire`BIGINT,primarykey(`lock_key`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;INSERTINTO`distributed_lock`(lock_key,lock_value,expire)VALUES('AsyncCommitting',' ',0);INSERTINTO`distributed_lock`(lock_key,lock_value,expire)VALUES('RetryCommitting',' ',0);INSERTINTO`distributed_lock`(lock_key,lock_value,expire)VALUES('RetryRollbacking',' ',0);INSERTINTO`distributed_lock`(lock_key,lock_value,expire)VALUES('TxTimeoutCheck',' ',0);

创建数据库seata_server,注意数据库编码使用utf8mb4格式,导入数据库文件

修改application.yml文件

修改D:\seata\seata\conf文件夹下的application.yml文件
这个配置文件用于配置seata的注册中心,配置中心,以及事务相关的数据存储到哪里。

# Copyright 1999-2019 Seata.io Group.## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.server:port:7091spring:application:name:seata-serverlogging:config:classpath:logback-spring.xmlfile:path:${user.home}/logs/seataextend:logstash-appender:destination:127.0.0.1:4560kafka-appender:bootstrap-servers:127.0.0.1:9092topic:logback_to_logstashconsole:user:username:seatapassword:seataseata:config:# support: nacos, consul, apollo, zk, etcd3# 这里配置的nacos的配置中心的位置type:nacosnacos:server-addr:127.0.0.1:8848namespace:group:SEATA_GROUPusername:nacospassword:nacosregistry:# support: nacos, eureka, redis, zk, consul, etcd3, sofa# 这里配置的nacos的注册中心的位置,用于注册seata服务。type:nacosnacos:application:seata-serverserver-addr:127.0.0.1:8848group:SEATA_GROUPnamespace:cluster:defaultusername:nacospassword:nacosstore:# support: file 、 db 、 redis# 这里是使用数据库存储 事务相关的数据。mode:dbdb:datasource:druiddb-type:mysqldriver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://127.0.0.1:3306/seata_server?rewriteBatchedStatements=trueuser:rootpassword:rootmin-conn:10max-conn:100global-table:global_tablebranch-table:branch_tablelock-table:lock_tabledistributed-lock-table:distributed_lockquery-limit:1000max-wait:5000# server:# service-port: 8091 #If not configured, the default is '${server.port} + 1000'security:secretKey:SeataSecretKey0c382ef121d778043159209298fd40bf3850a017tokenValidityInMilliseconds:1800000ignore:urls:/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login

修改config.txt文件

打开文件D:\seata-server-1.7.0\seata\script\config-center 打开config.txt文件
修改数据库连接信息

store.db.dbType=mysql store.db.driverClassName=com.mysql.cj.jdbc.Driver store.db.url=jdbc:mysql://127.0.0.1:3306/seata_server?useUnicode=true&rewriteBatchedStatements=truestore.db.user=root store.db.password=root

修改nacos-config.sh文件

修改D:\seata-server-1.7.0\seata\script\config-center\nacos下的 修改nacos-config.sh

这份 Shell 脚本是 Seata 官方提供的 Nacos 配置自动初始化脚本,核心作用是:读取本地config.txt中的 Seata 配置项,自动批量推送到 Nacos 配置中心,避免手动在 Nacos 控制台逐个添加配置的繁琐操作。

# 其他配置.........if[-z${host}];thenhost=localhostfiif[-z${port}];thenport=8848fiif[-z${group}];thengroup="SEATA_GROUP"fiif[-z${tenant}];thentenant=""fiif[-z${username}];thenusername="nacos"fiif[-z${password}];thenpassword="nacos"fi# 其他配置.........

启动nacos后,在去双击nacos-config.sh文件运行(前提是必须安装git)

查看naocs配置信息,能找到103条信息说明正确。

启动seata服务

在seata下的bin目录下,启动seata-server.bat文件

查看nacos注册中心看看是否被注册为服务。只要有seata-server就行

Seata Client(客户端)搭建

创建undo_log表。

由上一章内容可知。客户端需要借助数据库中的undo_log表才能实现一阶段
所以你需要在你要添加事务的业务模块所在表中添加undo_log表。

举个例子:你的要下订单并减库存

  1. 假设你的下订单减库存在一个叫做A的数据库,就只需要在A这个数据库添加undo_log表。
  2. 如果你的下订单减库存分别在A数据库和B数据库中,即分库了,那么你需要分别在A和B数据库添加undo_log表。

undo_log表结构如下。

CREATETABLE`undo_log`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`branch_id`bigint(20)NOTNULL,`xid`varchar(100)NOTNULL,`context`varchar(128)NOTNULL,`rollback_info`longblobNOTNULL,`log_status`int(11)NOTNULL,`log_created`datetimeNOTNULL,`log_modified`datetimeNOTNULL,PRIMARYKEY(`id`),UNIQUEKEY`ux_undo_log`(`xid`,`branch_id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8;

引入pom文件

你需要在你需要事务的模块都引入seata。
比如我有下单和库存两个微服务模块,那么我就需要再两个微服务模块都引入这个包。

<dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.7.0</version></dependency>

引入配置文件

注意:你需要在你需要事务的模块都引入seata配置文件。
比如我有患者下单和库存两个微服务模块,那么我就需要再两个微服务模块都写入这个配置文件。

# Seata客户端配置seata:enabled:trueapplication-id:patient-server# 你当前模块在nacos注册中心的名字,只有这里不同。tx-service-group:default_tx_group# 使用默认事务组 在你导入的103个配置文件中enable-auto-data-source-proxy:true#config:type:nacosnacos:server-addr:127.0.0.1:8848namespace:""# public命名空间group:SEATA_GROUPusername:nacospassword:nacosregistry:type:nacosnacos:application:seata-serverserver-addr:127.0.0.1:8848namespace:""# public命名空间group:SEATA_GROUPcluster:defaultusername:nacospassword:nacos

启动项目查看是否连接成功

在控制台按住Ctrl+F看看TMRM是否注册成功

6. 项目中的使用

上面我们已经在项目中导入了包并成功启动了

患者下单的service

我把我项目中一部分拿出来。

@ServicepublicclassPatientPayServiceImplimplementsPatientPayService{@ResourceprivateMaterialInventoryApimaterialInventoryApi;// 调用库存模块的减库存操作@ResourceprivateTreatmentRecordMappertreatmentRecordMapper;@Override@GlobalTransactional(name="patient-pay",rollbackFor=Exception.class)publicStringpatientPay(TreatmentRecordtreatmentRecord){// ...........// 更新订单状态intupdateCount=treatmentRecordMapper.updateById(updateRecord);if(updateCount==0){System.err.println("更新支付状态失败(recordId="+treatmentRecord.getRecordId()+")");thrownewRuntimeException("更新支付状态失败");}// .........// 调用别的服务CommonResult<Integer>result=materialInventoryApi.subtractMaterialInventory(item.getItemName(),item.getQuantity());if(result.getCode()!=0||result.getData()==0){System.err.println("扣减库存失败:物品="+item.getItemName()+", 数量="+item.getQuantity()+",接口返回:"+result.getCode()+" - "+result.getMsg());// 主动抛出异常,触发Seata回滚thrownewRuntimeException("库存扣减失败:"+result.getMsg());}else{System.out.println("扣减库存成功:物品="+item.getItemName()+", 影响行数="+result.getData());}return"支付成功";}}

库存service

api

@FeignClient(name="storeroom")@Tag(name="操作物品库存接口")publicinterfaceMaterialInventoryApi{/** * 减物品库存 * @param materialName 物资名称 * @param count 减库存数量 * @return 0表示失败, 1 表示成功 */@PostMapping("/storeroom/inventory/subtractInventory")@Operation(summary="减物品库存")@Parameters({@Parameter(name="materialName",description="物品名称",required=true),@Parameter(name="count",description="数量",required=true)})CommonResult<Integer>subtractMaterialInventory(@RequestParam("materialName")StringmaterialName,@RequestParam("count")Integercount);}

api实现

@RestController@ValidatedpublicclassMaterialInventoryApiImplimplementsMaterialInventoryApi{@ResourceprivateInventoryInfoMapperinventoryInfoMapper;@Override@Transactional@TenantIgnore// 忽略租户@PermitAll// 忽略登录/权限校验publicCommonResult<Integer>subtractMaterialInventory(StringmaterialName,Integercount){inti=1/0;// ....result=inventoryInfoMapper.subtractMaterialInventory(warehouseId,materialId,count);returnsuccess(result);}}

查看是否回滚

查看控制台,Ctrl+F搜索

查看undo_log表,如果没有任何东西说明也回滚了。因为回滚成功seata会自动删除undo_log表的相关数据。

失败的原因

当使用全局异常处理器(比如:@RestControllerAdvice)时,它会捕获Controller层抛出的所有异常,并返回统一的响应格式。这会干扰Seata的异常传播机制。

原理

  1. 异常被拦截:当库存服务抛出RuntimeException时,@RestControllerAdvice会捕获这个异常。
  2. 返回正常响应:异常处理器将异常转换为CommonResult等统一响应对象返回给调用方。
  3. Seata无法感知异常:由于没有异常向上传播,Seata的事务拦截器无法检测到异常,因此不会触发回滚。
  4. 需要手动判断:您必须通过判断result.getCode() != 0来手动抛出异常。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/7 19:19:08

完整指南:用Figma-Context-MCP实现AI助手与设计稿的智能对话

完整指南&#xff1a;用Figma-Context-MCP实现AI助手与设计稿的智能对话 【免费下载链接】Figma-Context-MCP MCP server to provide Figma layout information to AI coding agents like Cursor 项目地址: https://gitcode.com/gh_mirrors/fi/Figma-Context-MCP 想要让…

作者头像 李华
网站建设 2026/2/27 10:00:30

AI 正在“吃光内存”,NVIDIA与SK海力士把目光投向了 NAND

继大规模蚕食DRAM市场后&#xff0c;英伟达与SK海力士计划推出性能提升近10倍的"AI SSD"&#xff0c;引发NAND供应警报。随着AI产业重心从训练转向推理&#xff0c;技术栈需全面升级以构建低延迟、高吞吐环境&#xff0c;行业正聚焦通过NAND芯片打造推理优化的AI存储…

作者头像 李华
网站建设 2026/3/5 1:43:37

ThingsBoard智能消息路由:3大策略提升物联网数据处理效率

ThingsBoard智能消息路由&#xff1a;3大策略提升物联网数据处理效率 【免费下载链接】thingsboard Open-source IoT Platform - Device management, data collection, processing and visualization. 项目地址: https://gitcode.com/GitHub_Trending/th/thingsboard 在…

作者头像 李华
网站建设 2026/2/28 21:14:25

WTAPI框架:重新定义微信个人号二次开发的全能解决方案

微信个人号作为国内超13亿用户的核心社交入口&#xff08;截至2023年Q2&#xff09;&#xff0c;已成为企业私域运营与用户服务的核心阵地。然而&#xff0c;微信原生功能在自动化运营、数据管理及多账号协同等场景中存在显著局限&#xff1a;自动化能力缺失&#xff1a;无法实…

作者头像 李华
网站建设 2026/3/5 14:33:54

Homepage媒体服务集成终极指南:快速配置多平台监控面板

Homepage媒体服务集成终极指南&#xff1a;快速配置多平台监控面板 【免费下载链接】homepage 一个高度可定制的主页&#xff08;或起始页/应用程序仪表板&#xff09;&#xff0c;集成了Docker和服务API。 项目地址: https://gitcode.com/GitHub_Trending/ho/homepage …

作者头像 李华
网站建设 2026/3/5 10:24:48

如何快速排查Rod自动化脚本中的常见问题

如何快速排查Rod自动化脚本中的常见问题 【免费下载链接】rod A Devtools driver for web automation and scraping 项目地址: https://gitcode.com/gh_mirrors/ro/rod 当你在使用Rod进行浏览器自动化和Web爬虫开发时&#xff0c;是否经常遇到脚本卡死、页面加载异常或元…

作者头像 李华