Seata入门系列【2】Spring Cloud 2021.0.5集成seata 1.7.1

news2024/10/7 8:24:12

1 引出分布式事务问题

1.1 seata-service-account编写查询用户、远程调用下订单接口

@RestController
@RequestMapping("/accountTbl")
public class AccountTblController {

    @Autowired
    AccountTblMapper accountTblMapper;
    @Autowired
    OrderFeign orderFeign;


    @GetMapping("/insertOrder")
    public Object insertOrder() {
        // 查询用户
        AccountTbl accountTbl = accountTblMapper.selectById("11111111");
        // 下单
        Object order = orderFeign.insertOrder(accountTbl.getUserId(), "iphone11", 1, 1);
        // 修改余额
        accountTbl.setMoney(accountTbl.getMoney() - 1);
        accountTblMapper.updateById(accountTbl);
        return order;
    }
}

@FeignClient(name = "seata-service-order")
public interface OrderFeign {

    @GetMapping("orderTbl/insertOrder")
    Object insertOrder(@RequestParam String userId,@RequestParam  String commodityCode,@RequestParam  int count,@RequestParam  int money);
}

1.2 seata-service-order编写下订单,远程调用减库存接口

@RestController
@RequestMapping("/orderTbl")
public class OrderTblController {
    @Autowired
    OrderTblMapper orderTblMapper;
    @Autowired
    StorageFeign storageFeign;

    @GetMapping("insertOrder")
    public Object insertOrder(String userId, String commodityCode, int count, int money) {
        // 下定单
        OrderTbl orderTbl = new OrderTbl();
        orderTbl.setUserId(userId);
        orderTbl.setCommodityCode(commodityCode);
        orderTbl.setCount(count);
        orderTbl.setMoney(1);
        // 下订单扣库存
        orderTblMapper.insert(orderTbl);
        Object storage = storageFeign.updateStorage(commodityCode, count);
        return orderTbl;
    }
}

@FeignClient(name = "seata-service-storage")
public interface StorageFeign {
    @GetMapping("/storageTbl/updateStorage")
    Object updateStorage(@RequestParam String commodityCode,@RequestParam  int count);
}

1.3 seata-service-storage编写减库存接口

@RestController
@RequestMapping("/storageTbl")
public class StorageTblController {
    @Autowired
    StorageTblMapper storageTblMapper;

    @GetMapping("updateStorage")
    Object updateStorage(String commodityCode, int count){
        // 查询库存
        StorageTbl storageTbl = storageTblMapper.selectOne(new LambdaQueryWrapper<StorageTbl>().eq(StorageTbl::getCommodityCode, commodityCode));
        // 减去库存更新
        storageTbl.setCount(storageTbl.getCount()-count);
        int i = storageTblMapper.updateById(storageTbl);
        return storageTbl;
    }
}

1.4 引出分布式事务

当我们关闭seata-service-storage服务,访问/accountTbl/insertOrder接口,会发现下单成功了,但是未扣库存,所以需要引入分布式事务,对一些跨服务的改库操作进行全局管理

2 集成Seata解决分布式事务问题

2.1 各个数据据添加undo_log表

CREATE TABLE `undo_log` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `branch_id` bigint NOT NULL,
  `xid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `context` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci 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`) USING BTREE,
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

2.2 父pom添加seata依赖

        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
            <version>1.6.1</version>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba</groupId>
                    <artifactId>druid</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>io.seata</groupId>
                    <artifactId>seata-spring-boot-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

2.3 各模块添加yml配置

seata:
  enabled: true
  application-id: seata-service-account # 添加为服务名
  tx-service-group: my_test_tx_group
  config:
    type: nacos
    nacos:
      namespace:
      serverAddr: 127.0.0.1:8848
      group: SEATA_GROUP
  registry:
    type: nacos
    nacos:
      application: seata-server
      server-addr: 127.0.0.1:8848
      group: SEATA_GROUP
      namespace:

2.4 调用链开端AccountTblController接口添加@GlobalTransactional注解

在这里插入图片描述

2.5 手动实现xid传递

手动实现xid传递,实际cloud alibaba通过已实现了自动传递,但是新版openfeign移除了很多组件,需要自己实现,添加配置类,并重新去掉自动配置

/**
 * @author wuKeFan
 * @date 2020/11/27
 */
@Component
@ConditionalOnClass({RequestInterceptor.class, GlobalTransactional.class})
public class SeataRequestInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate template) {
        String currentXid = RootContext.getXID();
        if (StrUtil.isNotBlank(currentXid) && !template.url().startsWith(Auth.CHECK_TOKEN_URI) && !template.url().startsWith(Auth.CHECK_RBAC_URI)) {
            template.header(RootContext.KEY_XID, currentXid);
        }
    }
}
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SeataHandlerInterceptor()).addPathPatterns("/**");
    }
}
@SpringBootApplication(exclude = {SeataFeignClientAutoConfiguration.class})

2.6 启动各个项目,访问接口,全局事务提交成功

在这里插入图片描述

2.7 模拟异常

在这里插入图片描述
当账户因为异常回滚后,并没有订单及库存数据不一致,全局事务回滚

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1044729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

西门子KTP触摸屏做画面时如何把设备图片或Logo做到画面上?

西门子KTP触摸屏做画面时如何把设备图片或Logo做到画面上&#xff1f; 如下图所示&#xff0c;新建一个项目&#xff0c;添加一个触摸屏设备&#xff0c;这里以TP1200 Comfort触摸屏为例进行说明&#xff0c;双击进入根画面&#xff0c; 如下图所示&#xff0c;在右侧的工具箱中…

SpringBoot 学习(一)自动装配

本系列文章为【狂神说 Java 】视频的课堂笔记&#xff0c;若有需要可配套视频学习。 1.1 pom.xml (1) 父工程&#xff08; spring-boot-starter-parent &#xff09; 核心依赖&#xff0c;静态资源过滤等配置。编写或导入 springboot 依赖时不需要指定版本号&#xff0c;继承…

MySQL 连接查询(多表查询 二)

基本介绍 作用&#xff1a;连接查询&#xff08;Join&#xff09;操作&#xff0c;用于联结多个表以获取更全面和准确的数据 基本分类&#xff1a; 内连接&#xff1a;相当于查询A、B交集部分数据&#xff08;去掉迪卡尔积无效组合&#xff09;外连接&#xff1a; 左外连接&…

nginx: 部署前端项目的详细步骤(vue项目build打包+nginx部署)

目录 第一章 前言 第二章 准备工作 2.1 项目打包理解 2.1.1 打包命令 2.1.2 理解npm run serve/dev 和 npm run build命令 2.2 nginx参数配置理解 2.2.1 nginx常用基本命令 2.2.2 默认配置 2.2.3 搭建不同网站的站点 2.2.4 禁止访问的目录以及一键申请SSL证书验证目录…

Red Hat更新开发套件了,有你期待的功能吗?

导读近日&#xff0c;Red Hat公司将Red Hat Development Suite更新到了2.0版本&#xff0c;其中包括对Red Hat JBoss Development Suite和Red Hat Container Development Kit的一系列优化。 Red Hat Development Suite 2.0版本的主题是扩展可用性与产品集成&#xff0c;以及扩展…

毕业设计--基于SpringBoot+Vue的科研课题项目管理系统

介绍 基于SpringBootVue的科研课题项目管理系统 &#xff1b; 实现 登录 /注销、 用户管理、项目管理、申报管理、变更管理、结题管理、角色管理、权限管理、数据字典等功能 &#xff1b; 可作为 SpringBoot前后端分离项目 开发练习模型、课程设计 、 毕业设计 等。 环境准…

上车加速!为下一代LCoS HUD造势,华为和哪些企业在领跑

高工智能汽车研究院监测数据显示&#xff0c;今年1-7月中国市场&#xff08;不含进出口&#xff09;乘用车前装标配W/AR HUD交付108.35万辆&#xff0c;同比增长47.98%&#xff0c;前装搭载率升至9.82%。 其中&#xff0c;从价位区间分布来看&#xff0c;30万元及以上车型标配W…

【如何看待Unity收费】对标中小公司的待就业者的该如何做

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

多个vtk文件合并

收费工具&#xff0c;白嫖党勿扰 收费金额200元 程序下载链接 1 概述 最近在项目上&#xff0c;有一个客户&#xff0c;通过超算&#xff0c;得到了几百个vtk文件&#xff0c;让我们显示出来&#xff0c;将这几百个vtk文件分别解析&#xff0c;然后再做可视化显示&#xff0c…

更好的用户体验, 开源实时监控新版发布

哈喽大家好&#xff0c;时间很快两个月又过去了&#xff0c;HertzBeat 经过近两个月的迭代终于发布了 v1.4.1 版本。为什么是终于&#xff0c;因为有点难哈哈。我们参考 rocketmq 重构了 netty 的 server client 端模块&#xff0c;重构了采集器集群调度。比起上一版本有了更优…

2023-09-27 monetdb-存储架构-记录

摘要: 2023-09-27 monetdb-存储架构-记录 存储架构 MonetDB SAM/BAM 模块支持两种类型的模式来存储 SAM/BAM 数据。使用顺序模式&#xff0c;所有对齐记录都可以轻松读取、解析并随后存储&#xff0c;与它们在 SAM/BAM 文件中的存储方式相当。使用成对模式&#xff0c;对齐记…

【计算机网络笔记六】应用层(三)HTTP 的 Cookie、缓存控制、代理服务、短连接和长连接

HTTP 的 Cookie HTTP 的 Cookie 机制要用到两个字段&#xff1a;响应头字段 Set-Cookie 和请求头字段 Cookie。 Cookie 可以设置多个 key-value 对&#xff0c; 响应头中可以设置多个 Set-Cookie 字段&#xff0c;请求头Cookie后面可以设置多个键值对&#xff0c;用分号隔开&a…

Linux工具(二)

前言&#xff1a;在Linux工具&#xff08;一&#xff09;中&#xff0c;我们学习了yum软件安装工具和vim文本编辑器工具&#xff0c;那么本次我们就再来介绍两种工具&#xff0c;分别是&#xff0c;编辑器gcc/g、项目自动化构建工具-make/Makefile &#xff0c;接着我们再来写一…

【Linux进行时】环境变量and进程优先级

1.环境变量 ❓首先一个问题&#xff1a;我写的代码&#xff08;这个代码很简单&#xff0c;不用管&#xff09;编译之后运行的时候为什么要带./ &#xff1f; 或者说我怎么才可以让我不用带./ &#xff1f; &#x1f4a1;.代表当前文件下&#xff0c;/是文件分隔符&#xff0c;…

【re】BUUCTF [GXYCTF2019]luck_guy

题目&#xff1a;BUUCTF [GXYCTF2019]luck_guy 无壳&#xff0c;64位&#xff0c;ida打开找找找到get_flag()函数 for ( i 0; i < 4; i ){switch ( rand() % 200 ){case 1:puts("OK, its flag:");memset(s, 0, sizeof(s));strcat((char *)s, f1);strcat((char *…

Mysql基础【操作数据库表】

一、数据库相关概念&#x1f353; 数据库: 存储数据的仓库&#xff0c;数据是有组织的进行存储,英文&#xff1a;DataBase&#xff0c;简称 DB 存储和管理数据的仓库其本质是一个文件系统, 还是以文件的方式,将数据保存在电脑上 数据库管理系统&#xff1a;管理数据库的大型软…

常用黑客指令【建议收藏】

系统信息 arch #显示机器的处理器架构(1) uname -m #显示机器的处理器架构(2) uname -r #显示正在使用的内核版本 dmidecode -q #显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda #罗列一个磁盘的架构特性 hdparm -tT /dev/sda #在磁盘上执行测试…

【算法系列篇】与链表相关的算法

文章目录 前言1. 两数相加1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 两两交换链表中的节点2.1 题目要求2.2 做题思路2.3 Java代码实现 3. 重排链表3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 合并 k 个升序链表4.1 题目要求4.2.1 做题思路一4.3.1 方法一Java代码实现4.2…

将yolo格式数据集转换为VOC格式

将yolo格式数据集转换为VOC格式 背景代码 由于需要切分图象&#xff0c;将yolo转换为voc格式好处理一些 背景 代码 import xml.dom.minidom import glob from PIL import Image from math import ceil import shutil import osyolo_file rE://黄花标注//glass//train//split…

Ubuntu 23.10 支持基于 TPM 的全磁盘加密

导读即将发布的 Ubuntu23.10 增加了一项实验性功能 —— 初步支持基于 TPM 的全磁盘加密。该功能利用系统的可信平台模块 (TPM)&#xff0c;缺点是这种额外的安全性依赖于 Snaps&#xff0c;包括内核和 GRUB 引导加载器。 Ubuntu 开发商 Canonical 公司表示&#xff0c;Ubuntu…