当前位置: 首页 > news >正文

2.Seata 1.5.2 集成Springcloud-alibaba

一.Seata-server搭建已完成前提下

详见 Seata-server搭建

二.Springcloud 项目集成Seata

项目整体测试业务逻辑是创建订单后(为了演示分布式事务,不做前置库存校验),再去扣减库存。库存不够的时候,创建的订单信息数据也会回退。

2.1 springboot,springcloud,springboot,seata项目版本的版本管理pom配置

    <!-- 统一依赖版本管理 --><properties><spring.boot.version>2.6.11</spring.boot.version><spring-cloud.version>2021.0.4</spring-cloud.version><spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version><seata.version>1.5.2</seata.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring.boot.version}</version><type>pom</type><scope>import</scope><exclusions><exclusion><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

2.2 Porduct项目seata核心依赖和配置及代码和undolog表初始化

基本的web,持久化,数据库,数据配置中心,注册中心依赖此处略。
核心pom.xml如下:

        <!--seata 分布式事务组件--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>

appliction.yml 核心配置如下:

# 端口
server:port: 8050servlet:context-path: /productApispring:application:name: dolphin-jinyi-productprofiles:active: devmvc:pathmatch:matching-strategy: ant_path_matchermain:allow-bean-definition-overriding: truecloud:nacos:# 注册中心discovery:server-addr: localhost:8848namespace: d6eccad6-681c-4133-b9ff-1abcd951297agroup: DOLPHIN_GROUP# 配置中心config:server-addr: localhost:8848file-extension: ymlgroup: DOLPHIN_GROUPnamespace: d6eccad6-681c-4133-b9ff-1abcd951297a# 这里可以配置多个共享配置文件shared-configs:- data-id: mysql-common.ymlgroup: DEFAULT_GROUPrefresh: true- data-id: redis-common.ymlgroup: DEFAULT_GROUPrefresh: true
logging:level:io:seata: INFO
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplseata:registry:# 配置seata的注册中心, 告诉seata client 怎么去访问seata server(TC)type: nacosnacos:server-addr: 127.0.0.1:8848  # seata server 所在的nacos服务地址application: seata-server    # seata server 的服务名seata-server ,如果没有修改可以不配username: nacospassword: nacosgroup: DOLPHIN_GROUP             # seata server 所在的组,默认就是SEATA_GROUP,没有改也可以不配namespace: d6eccad6-681c-4133-b9ff-1abcd951297aconfig:type: nacosnacos:server-addr: 127.0.0.1:8848username: nacospassword: nacosgroup: DOLPHIN_GROUP             # seata server 所在的组,默认就是SEATA_GROUP,没有改也可以不配namespace: d6eccad6-681c-4133-b9ff-1abcd951297a#指定Nacos上的DataIddata-id: seata-server.ymltx-service-group: default_tx_group  #这里每个服务都是对应不同的映射名,在配置中心可以看到 事务分组,必须和服务器配置一样service:vgroup-mapping:default_tx_group: defaultgrouplist:default: localhost:8091

java核心伪代码示例:

 */
@RestController
@RequestMapping("/product")
@Api(value = "商品Api", tags = {"商品Api"})
public class ProductController {@Resourceprivate IProductService productService;@PostMapping("updateProductStock")@ApiOperation(value = "updateProductStock-更新商品库存", notes = "updateProductStock-更新商品库存")public R updateProductStock(@RequestParam(value = "productId") Integer productId,@RequestParam(value = "num")  Integer num) {productService.updateProductStock(productId,num);return R.ok();}
}
public interface IProductService extends IService<Product> {void updateProductStock(Integer productId, Integer num);
}

注:核心点在于根据产品id扣减库存的方法上需要分支事务 @Transactional(rollbackFor = Exception.class)注解。

@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements IProductService {@Override@Transactional(rollbackFor = Exception.class)public void updateProductStock(Integer productId, Integer num) {System.out.println("事务id---------------------->" + RootContext.getXID());LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<Product>().eq(Product::getProductId, productId).eq(Product::getStatus, 1).last("limit 1");Product product = this.getOne(queryWrapper);if (Objects.isNull(product)) {//商品不存在时抛异常throw new BizException(ResultCodeEnum.DATA_NOT_FOUND);}Integer stockNum = product.getStockNum() + num;if (stockNum < 0) {//库存不足时,抛异常throw new BizException(ResultCodeEnum.PRODUCT_STOCK_NOT_ENOUGH);}product.setStockNum(stockNum);this.updateById(product);}
}

在product项目对应的数据库中初始化undo_log表

CREATE TABLE `undo_log` (`branch_id` bigint(20) NOT NULL COMMENT 'branch transaction id',`xid` varchar(128) NOT NULL COMMENT 'global transaction id',`context` varchar(128) NOT NULL COMMENT 'undo_log context,such as serialization',`rollback_info` longblob NOT NULL COMMENT 'rollback info',`log_status` int(11) NOT NULL COMMENT '0:normal status,1:defense status',`log_created` datetime(6) NOT NULL COMMENT 'create datetime',`log_modified` datetime(6) NOT NULL COMMENT 'modify datetime',UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`),KEY `ix_log_created` (`log_created`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AT transaction mode undo table';

2.3 Order项目seata核心依赖和配置及代码和undolog表初始化

基本的web,持久化,数据库,数据配置中心,注册中心依赖此处略。
核心pom.xml如下:

        <!--seata 分布式事务组件--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>

appliction.yml 核心配置如下:

# 端口
server:port: 8010servlet:context-path: /orderApispring:application:name: dolphin-jinyi-orderprofiles:active: devmvc:pathmatch:matching-strategy: ant_path_matchermain:allow-bean-definition-overriding: truecloud:nacos:# 注册中心discovery:server-addr: localhost:8848namespace: d6eccad6-681c-4133-b9ff-1abcd951297agroup: DOLPHIN_GROUP# 配置中心config:server-addr: localhost:8848file-extension: ymlgroup: DOLPHIN_GROUPnamespace: d6eccad6-681c-4133-b9ff-1abcd951297a# 这里可以配置多个共享配置文件shared-configs:- data-id: redis-common.ymlgroup: DEFAULT_GROUPrefresh: truemybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
seata:registry:# 配置seata的注册中心, 告诉seata client 怎么去访问seata server(TC)type: nacosnacos:server-addr: 127.0.0.1:8848  # seata server 所在的nacos服务地址application: seata-server    # seata server 的服务名seata-server ,如果没有修改可以不配username: nacospassword: nacosgroup: DOLPHIN_GROUP             # seata server 所在的组,默认就是SEATA_GROUP,没有改也可以不配namespace: d6eccad6-681c-4133-b9ff-1abcd951297aconfig:type: nacosnacos:server-addr: 127.0.0.1:8848username: nacospassword: nacosgroup: DOLPHIN_GROUP             # seata server 所在的组,默认就是SEATA_GROUP,没有改也可以不配namespace: d6eccad6-681c-4133-b9ff-1abcd951297a#指定Nacos上的DataIddata-id: seata-server.ymltx-service-group: default_tx_group  #这里每个服务都是对应不同的映射名,在配置中心可以看到service:vgroup-mapping:default_tx_group: defaultgrouplist:default: localhost:8091

java核心伪代码示例:

@RestController
@RequestMapping("/order")
@Api(value = "订单Api", tags = {"订单Api"})
public class OrderController {@Resourceprivate IOrderService orderService;@ApiOperation(value = "createOrder-创建订单", notes = "createOrder-创建订单")@PostMapping("/createOrder")public R<Long> createOrder(@RequestBody @Validated OrderCreateDTO orderCreateDTO) {Long orderNo = orderService.createOrder(orderCreateDTO);return R.ok(orderNo);}
}
public interface IOrderService extends IService<Order> {Long createOrder(OrderCreateDTO orderCreateDTO);
}

注:核心注解 @GlobalTransactional

@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements IOrderService {@Resourceprivate ProductServiceFeignClient productServiceFeignClient;public Long createOrderNo() {return IdUtil.getSnowflakeNextId();}@Override@GlobalTransactionalpublic Long createOrder(OrderCreateDTO orderCreateDTO) {System.out.println("事务id---------------------->" + RootContext.getXID());Order order = new Order();BeanUtil.copyProperties(orderCreateDTO, order);order.setOrderNo(this.createOrderNo());//创建订单this.insertOrder(order);//通过feign调用商品服务扣减库存productServiceFeignClient.updateProductStock(order.getProductId(), -1);return order.getOrderNo();}@Transactional(rollbackFor = Exception.class)public void insertOrder(Order order) {System.out.println("事务id A---------------------->" + RootContext.getXID());boolean save = this.save(order);if (!save) {throw new BizException(ResultCodeEnum.SYSTEM_EXECUTION_ERROR);}}}

在order项目对应的数据库中初始化undo_log表

CREATE TABLE `undo_log` (`branch_id` bigint(20) NOT NULL COMMENT 'branch transaction id',`xid` varchar(128) NOT NULL COMMENT 'global transaction id',`context` varchar(128) NOT NULL COMMENT 'undo_log context,such as serialization',`rollback_info` longblob NOT NULL COMMENT 'rollback info',`log_status` int(11) NOT NULL COMMENT '0:normal status,1:defense status',`log_created` datetime(6) NOT NULL COMMENT 'create datetime',`log_modified` datetime(6) NOT NULL COMMENT 'modify datetime',UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`),KEY `ix_log_created` (`log_created`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AT transaction mode undo table';

三.设计到的nacos中的seata-server.yml等配置

注意上面项目的yml配置中的namespace,groupId,data-id 保持和nacos一直
在这里插入图片描述
seata-server.yml

service:vgroupMapping:default_tx_group: default

四 测试

测试时,保证seata-server order product 服务都已经启动。
现在库存有一个,没有订单信息数据。
在这里插入图片描述
在这里插入图片描述

4.1 第一次下单
在这里插入图片描述
商品表库存被扣减,创建订单成功
在这里插入图片描述
在这里插入图片描述
现在库存为0.第二次下单
在这里插入图片描述
订单没有新增,库存也没有扣减。分布式事务测试ok
在这里插入图片描述
在这里插入图片描述

相关文章:

2.Seata 1.5.2 集成Springcloud-alibaba

一.Seata-server搭建已完成前提下 详见 Seata-server搭建 二.Springcloud 项目集成Seata 项目整体测试业务逻辑是创建订单后&#xff08;为了演示分布式事务&#xff0c;不做前置库存校验&#xff09;&#xff0c;再去扣减库存。库存不够的时候&#xff0c;创建的订单信息数…...

python 图像绘制问题: 使用turtle库绘制蟒蛇

turtle &#xff08;海龟)库是turtle绘图体系的python实现。 1969年诞生&#xff0c;主要用于程序设计入门。 import turtle turtle.setup(650, 350, 200, 200) # 设置窗体&#xff08;宽&#xff0c;高&#xff0c;窗体左上角x坐标&#xff0c;y坐标&#xff09; turtl…...

大模型分布式训练并行技术(七)-自动并行

近年来&#xff0c;随着Transformer、MOE架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此&#xff0c;我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。 而利用AI集群&a…...

网络安全等级保护 | 规范企业网络系统安全使用 | 天锐股份助力等保制度落地

在当今数字化高速发展的时代&#xff0c;网络安全对于企业的重要性日益凸显。而近年来&#xff0c;数据泄露、网络攻击等安全事件频发&#xff0c;给企业和个人带来了前所未有的挑战。在这一背景下&#xff0c;网络安全等级保护制度&#xff08;简称“等保”&#xff09;作为国…...

Springboot使用redis,以及解决redis缓存穿透,击穿,雪崩等问题

1.Redis面试题-缓存穿透,缓存击穿,缓存雪崩 1 穿透: 两边都不存在&#xff08;皇帝的新装&#xff09; &#xff08;返回空值&#xff09;&#xff08;互斥锁&#xff09;&#xff08;黑名单&#xff09; &#xff08;布隆过滤器&#xff09; 2 击穿&#xff1a;一个或多个热…...

pve 命令开启关闭虚拟机

命令 #查看集群资源状况 #pvesh get /cluster/resources #取得虚拟机当前状态 #pvesh get /nodes/<节点id>/qemu/<虚拟机id>/status/current #pvesh get /nodes/www/qemu/107/status/current#关闭虚拟机 #pvesh create /nodes/<节点id>/qemu/<虚拟机id&…...

【达梦数据库】临时表的使用测试

目录 背景问题复现问题原因解决方法 背景 用户在使用临时表的过程中&#xff0c;执行commit提交命令之后&#xff0c;临时表的数据被清空&#xff0c;无法被接下来的存储过程复用。 问题复现 -----------------------------提交删除行----------------------------- --创建临…...

【GUI设计】基于Matlab的图像去噪GUI系统(8),matlab实现

博主简介&#xff1a; 如需获取设计的完整源代码或者有matlab图像代码项目需求/合作&#xff0c;可联系主页个人简介提供的联系方式或者文末的二维码。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于Matlab的图像去噪GUI系统&am…...

【计算机科学导论】

计算机科学的本质就是解决问题&#xff0c;我们计算机由输入设备&#xff0c;处理设备和输出设备组成。 处理设备看做一个大黑盒&#xff0c;目的就是接收处理数据&#xff0c;然后发送到输出设备。计算机中存储数据就是2进制&#xff0c;0和1&#xff0c;0代表关&#xff0c;…...

【C++】I/O流的使用介绍

文章目录 什么是 I/O 流&#xff1f;C I/O 流的基本类型常用的 I/O 操作1. 标准输入输出2. 文件输入输出3. 字符串流 什么是 I/O 流&#xff1f; 在 C 中&#xff0c;I/O 流是数据的输入和输出通道。流的本质是一个字节序列&#xff0c;提供了抽象的方式来读写数据。C 使用流对…...

深度学习:(八)深层神经网络参数与流程

深层神经网络 符号规定 L L L &#xff1a;表示神经网络的层数&#xff1b; l l l &#xff1a;表示第几层&#xff1b; n [ l ] n^{[~l~]} n[ l ] &#xff1a;表示第 l l l 层的节点数&#xff1b; a [ l ] a^{[~l~]} a[ l ] &#xff1a;表示第 l l l 层中的激活函数&…...

`pattern = r“(\d+)(CNY|JPY|HKD|EUR|GBP|fen|cents|sen|eurocents|pence)“

pattern r"(\d)(CNY|JPY|HKD|EUR|GBP|fen|cents|sen|eurocents|pence)" 是一个正则表达式&#xff0c;用于匹配特定格式的字符串。 正则表达式解析 整体结构&#xff1a; r"..."&#xff1a;前缀 r 表示这是一个原始字符串&#xff08;Raw String&#x…...

宝塔面板部署雷池社区版教程

宝塔面板部署雷池社区版教程 简单介绍一下宝塔面板&#xff0c;安全高效的服务器运维面板&#xff0c;使用宝塔面板的人非常多 在网站管理上&#xff0c;许多用户都是通过宝塔面板进行管理&#xff0c;宝塔面板的Nginx默认监听端口为80和443&#xff0c;这就导致共存部署时雷池…...

【击败100%】258. 各位相加

首次出现&#xff0c;代码用时击败了100%的用户&#xff0c;开心~ 题目 给定一个非负整数 num&#xff0c;反复将各个位上的数字相加&#xff0c;直到结果为一位数。返回这个结果。 示例 1: 输入: num 38 输出: 2 解释: 各位相加的过程为&#xff1a; 38 --> 3 8 -->…...

【alist】宝塔面板docker里的alist默认admin无法登录

宝塔docker安装完alist&#xff0c;根据页面的提示账号密码死活登录不上&#xff0c;提示密码有问题 页面提示&#xff1a; 数据存储目录 /www/dk_project/dk_app/dk_alist 使用说明请参考&#xff1a; >使用教程 默认账号密码&#xff08;admin/admin) 首次登录后点击个人…...

【击败100%】1281. 整数的各位积和之差

击败了100%的用户&#xff0c;开心~ 题目 给你一个整数 n&#xff0c;请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 示例 1&#xff1a; 输入&#xff1a;n 234 输出&#xff1a;15 解释&#xff1a; 各位数之积 2 * 3 * 4 24 各位数之和 2 3 4 …...

Flink基本概念和算子使用

基础概念 Flink是一个框架和分布式处理引擎&#xff0c;用于对无界数据流和有界数据流进行有状态计算&#xff0c;它的核心目标是“数据流上的有状态计算”。 有界流和无界流 有界流&#xff1a;具有明确的开始和结束时间&#xff0c;数据量有限。适合使用批处理技术&#xf…...

Kafka 3.0.0集群部署教程

1、集群规划 主机名 ip地址 node.id process.roles kafka1 192.168.0.29 1 broker,controller Kafka2 192.168.0.30 2 broker,controller Kafka3 192.168.0.31 3 broker,controller 2、将kafka包上传以上节点/app目录下 mkdir /app 3、解压kafka包 所有节点 …...

昇思MindSpore进阶教程-格式转换

大家好&#xff0c;我是刘明&#xff0c;明志科技创始人&#xff0c;华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享&#xff0c;如果你也喜欢我的文章&#xff0c;就点个关注吧 MindSpore中可以把用于训练网络模型的数据…...

搜索软件 Everything 的安装与使用教程

一、Everything简介 适用于 Windows 的免费搜索工具 Everything 是 Windows 的即时搜索引擎。发现、整理并轻松访问文件和文件夹&#xff0c;一切尽在指尖&#xff01; PS&#xff1a;Everything无法对文件内容进行搜索&#xff0c;只能根据文件名和路径进行搜索 二、Everyt…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...

node.js的初步学习

那什么是node.js呢&#xff1f; 和JavaScript又是什么关系呢&#xff1f; node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说&#xff0c; 需要在node.js的环境上进行当JavaScript作为前端开发语言来说&#xff0c;需要在浏览器的环境上进行 Node.js 可…...