SpringCloud Alibaba-Seata

news2024/10/6 8:29:57
接上文 SpringCloud Alibaba - Sentinel

1.简介(Seata与分布式事务)

在这里插入图片描述

Seata官方网址https://seata.io/zh-cn/docs/overview/what-is-seata.html

在这里插入图片描述
在这里插入图片描述

2.环境搭建

首先对之前的图书借阅系统进行升级:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

编写对应的服务接口。

(1)用户服务

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)图书服务

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(3)借阅服务

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

测试存在的问题

用户1号借阅1号书,显示已被借阅
在这里插入图片描述
在这里插入图片描述
1号借2号书则成功
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.分布式事务解决方案

1.常用的分布式事务解决方案

1. XA分布式事务协议-2PC

在这里插入图片描述

2PC-存在的问题在这里插入图片描述

3.2 XA分布式事务协议-3PC

在这里插入图片描述

3PC-存在的问题

在这里插入图片描述

3.3 TCC(补偿事务)T

4 Seata机制

在这里插入图片描述

4.1 Seata的四种事务模式

在这里插入图片描述

4.2 使用file模式部署

在这里插入图片描述

https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.zip
https://github.com/seata/seata/archive/refs/heads/develop.zip
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
接着将各个服务作为Seata的客户端,只需导入依赖即可。其他服务同理
在这里插入图片描述添加配置文件
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
给每个服务启动类添加注解@EnableAutoDataSourceProxy

在这里插入图片描述在这里插入图片描述在这里插入图片描述

配置完重启所有的服务,此时重启后所有服务都连接到seata,但是没有开启任何的分布式服务。 接着通过注解添加分布式服务,添加完重启borrow服务。

在这里插入图片描述

此时因为Seata会分析修改数据的sql,同时生成对应的反向回滚SQL,这个回滚记录会放在undo_log表中,因此要求每个client都要有一个对应的undo_log表,(即每个服务连接的数据库都需要创建这样一个表,这里因为三个服务都用的一个数据库,因此只在这个数据库中添加一个undo_log即可)。sql定义如下:

CREATE TABLE `undo_log`
(
  `id`            BIGINT(20)   NOT NULL AUTO_INCREMENT,
  `branch_id`     BIGINT(20)   NOT NULL,
  `xid`           VARCHAR(100) NOT NULL,
  `context`       VARCHAR(128) NOT NULL,
  `rollback_info` LONGBLOB     NOT NULL,
  `log_status`    INT(11)      NOT NULL,
  `log_created`   DATETIME     NOT NULL,
  `log_modified`  DATETIME     NOT NULL,
  `ext`           VARCHAR(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8;

创建完表重启三个服务,此时已配置完成。
然后重置以下表的数据,分别如下:
book表
在这里插入图片描述
借阅表
在这里插入图片描述
用户表
在这里插入图片描述

seata
在这里插入图片描述

然后进行访问借阅接口进行效果测试。

测试1:1号人第一次借1号书。结果:成功
在这里插入图片描述
测试2:1号人再次借1号书。结果:失败
在这里插入图片描述
在这里插入图片描述
此时seata会将该方法中的事务回滚,可以看到书籍数量没有减少
在这里插入图片描述
测试3:1号人借2号书一次。结果:成功
在这里插入图片描述
书籍数量减少
在这里插入图片描述
再次借阅则失败
在这里插入图片描述
书籍数量未减少
在这里插入图片描述
此时在同一事务内的XID是一样的。

4.3 使用Nacos模式部署

先单独为Seata配置一个命名空间
在这里插入图片描述
在这里插入图片描述
先关闭nacos和所有服务。然后修改seata目录conf下的配置文件register.conf。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

到此注册信息配置完。

注册信息配置完之后,需要将配置文件放到Nacos中,让Nacos管理配置,就可以进行热更新,直接在nacos中修改。
在这里插入图片描述
配置完然后回车
在这里插入图片描述

然后可以在nacos看到对应的配置:

然后需要将对应的事务组应映射配置也添加上,Datald格式为service.vgroupMapping.事务组名称,比如我们使用默认的名称,值全部default即可。在nacos配置事务组。

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
然后将对应的事务组映射配置也添加上,DataId格式为 service.vgroupMapping.事务组名称。此处使用默认的名称,值全部default即可。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

接着将book-service和borrow-service同样的形式在nacos上配置事务组,即上边紧挨的两张图。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

到此完成了服务端的Nacos配置,接着需要对客户端也进行Nacos配置;

在这里插入图片描述
将本地改为nacos服务端。
在这里插入图片描述其他user-service和book-service同理。配置完启动seata和三个服务。
在这里插入图片描述
在这里插入图片描述
然后重置数据库进行nacos上的seata测试。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
测试1:1号人借1号书。 结果:成功
在这里插入图片描述
书籍数量减少
在这里插入图片描述
生成借阅信息
在这里插入图片描述
再次测试 ,可以看到效果和file类型是一样的,1号人借1号书,结果:借阅失败,书籍数量未减少,不过现在的注册和配置都继承在nacos中了。
在这里插入图片描述
在这里插入图片描述

还可配置会话信息的存储方式,默认是file类型,那么就会在运行目录下 创建file_store目录,可以将其搬到数据库中存储,只需修改配置即可。

先将所有服务关闭。
在这里插入图片描述
在这里插入图片描述
同理进入编辑
在这里插入图片描述
改为db进行保存
在这里插入图片描述
在这里插入图片描述
然后修改数据库驱动、URL、用户名密码
在这里插入图片描述
修改url
在这里插入图片描述

在这里插入图片描述
修改用户名密码
在这里插入图片描述
操作数据库
创建用户并给权限在这里插入图片描述

在这里插入图片描述
创建数据库表

CREATE TABLE IF NOT EXISTS `global_table`
(
    `xid`                       VARCHAR(128) NOT NULL,
    `transaction_id`            BIGINT,
    `status`                    TINYINT      NOT NULL,
    `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,
    PRIMARY KEY (`xid`),
    KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),
    KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(
    `branch_id`         BIGINT       NOT NULL,
    `xid`               VARCHAR(128) NOT NULL,
    `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),
    PRIMARY KEY (`branch_id`),
    KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
    `row_key`        VARCHAR(128) NOT NULL,
    `xid`            VARCHAR(128),
    `transaction_id` BIGINT,
    `branch_id`      BIGINT       NOT NULL,
    `resource_id`    VARCHAR(256),
    `table_name`     VARCHAR(32),
    `pk`             VARCHAR(36),
    `status`         TINYINT      NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
    `gmt_create`     DATETIME,
    `gmt_modified`   DATETIME,
    PRIMARY KEY (`row_key`),
    KEY `idx_status` (`status`),
    KEY `idx_branch_id` (`branch_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `distributed_lock`
(
    `lock_key`       CHAR(20) NOT NULL,
    `lock_value`     VARCHAR(20) NOT NULL,
    `expire`         BIGINT,
    primary key (`lock_key`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('HandleAllSession', ' ', 0);

在这里插入图片描述
然后重启seata,看到数据源绑定成功:
在这里插入图片描述
重启所有服务,重置数据库和之前的类似。
在这里插入图片描述
进行借阅信息,但是报错显示服务名称过长。
在这里插入图片描述

在这里插入图片描述
解决过长问题,修改数据库字段类型,然后保存。
在这里插入图片描述
再次进行借阅两次,第一次显示成功,第二次显示已被借阅,书籍数量未减少。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
到此关于nacos模式下的Seata部署就完成了。
但此时若在高并发请求下,同一时间100个人借同一个书,但同一个书只有3本,可能不会正常的只借出3本书。

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

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

相关文章

操作系统:体系结构

1.内核的划分 1.术语解释 时钟管理:利用时钟断实现计时功能。原语是一种特殊的程序,具有原子性。也就是说,这段程序的运行必须一气呵成,不可被“中断”Ubuntu、Centos的开发团队,其主要工作是实现非内核功能,而内核都是用了Linux内核。 内核…

el-table-column默认选中一个复选框和只能单选事件

表格代码 <el-table ref"contractTable" v-loading"loading" :data"contractList" selection-change"contractSelectionChange" style"margin-top: 10%;"><el-table-column type"selection" width"…

【Linux】系统编程线程互斥与同步(C++)

目录 【1】线程互斥 【1.1】进程线程间的互斥相关背景概念 【1.2】互斥量mutex 【1.3】互斥量实现原理探究 【1.4】RAII的加锁风格 【2】可重入VS线程安全 【2.1】概念 【2.2】常见的线程不安全的情况 【2.3】常见的线程安全的情况 【2.4】常见不可重入的情况 【2.5…

【golang】深入理解GMP调度模型

Goroutine Go中&#xff0c;协程被称为goroutine&#xff0c;它非常轻量&#xff0c;一个goroutine只占几KB&#xff0c;并且这几KB就足够goroutine运行完&#xff0c;这就能在有限的内存空间内支持大量goroutine&#xff0c;支持了更多的并发&#xff0c;虽然一个goroutine的…

基于YOLOv8模型的条形码二维码检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型的条形码二维码检测系统可用于日常生活中检测与定位条形码与二维码目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测…

Ubuntu 12.04增加右键命令:在终端中打开增加打开文件

Ubuntu 12.04增加右键命令&#xff1a;在终端中打开 软件中心&#xff1a;搜索nautilus-open-terminal安装 用快捷键CtrlT打开命令行输入&#xff1a; sudo apt-get install nautilus-open-terminal 重新加载文件管理器 nautilus -q 或注销再登录即要使用

一文弄懂基于采样的路径规划-RRT系列(python代码)

基于采样的路径规划算法-RRT系列 VX关注晓理紫并回复rrt获取代码 [晓理紫] 1、基于采样的路径规划算法 基于抽样的规划方法&#xff08;或称概率方法&#xff09;通过在连续 C 空间中逐步或批量抽样&#xff0c;构建由离散 C 空间样本连接的树或图&#xff0c;从而捕捉解空间的…

飞书应用配置+蓝鲸流水线+jump server

开发者后台创建应用 配置应用基础信息&#xff0c;权限&#xff0c;安全等 管理后台 设置应用在工作台的可见范围和其他设置 Linux 常用命令&#xff1a;Linux 常用命令, ll 文件夹下文件&#xff0c;ls 文件&#xff0c;cd进入目录&#xff0c; cat 查看文件&#xff0c; v…

php反序列化+题

含义&#xff1a; php序列化&#xff08;serialize&#xff09;&#xff1a;是将变量转换为可保存或传输的字符串的过程php反序列化&#xff08;unserialize&#xff09;&#xff1a;就是在适当的时候把这个字符串再转化成原来的变量使用这两个过程结合起来&#xff0c;可以轻…

微信小程序底部安全区域高度获取

CSS 属性 safe-area-inset-bottom safe-area-inset-bottom 就是安全区的高度 padding-bottom:env(safe-area-inset-bottom); wx.getSystemInfoSync() wx.getSystemInfoSync()可以获取系统信息 let system wx.getSystemInfoSync() let bottomSafe system.screenHeight -…

React 全栈体系(十三)

第七章 redux 五、redux 异步编程 1. 理解 redux 默认是不能进行异步处理的,某些时候应用中需要在 redux 中执行异步任务(ajax, 定时器) 2. 使用异步中间件 npm install --save redux-thunk 3. 代码 - 异步 action 版 3.1 store /* src/redux/store.js */ /*** 该文件专…

全景剖析|国产芯(CPU、GPU、SSD、NAND、DRAM)虽有突破,但路还很长

这两天小编看到两个有关国产芯的消息,很有感触,本文小编分享下所思所想,如有不当之处,还望包涵,可以留言指正! 第一个消息是:近日,华为轮值主席 徐直军在2023世界计算大会上,有个国产芯的呼吁,“我们不要抱有幻想,应该坚定不移的打造可持续发展的计算产业生态。从计…

Webpack打包时Bable解决浏览器兼容问题

当我们使用js新特性语法编写代码时&#xff0c;在旧的浏览器中兼容性并不好。但是我们希望能够在旧浏览器中使用这些新特性。 使用babel可以使js新代码转换为js旧代码&#xff0c;增加浏览器的兼容性。 如果我们希望在Webpack中支持babel&#xff0c;则需要在Webpack中引入bab…

【C++】静态成员函数 ( 静态成员函数概念 | 静态成员函数声明 | 静态成员函数访问 | 静态成员函数只能访问静态成员 )

文章目录 一、静态成员函数简介1、静态成员函数概念2、静态成员函数声明3、静态成员函数访问4、静态成员函数只能访问静态成员 二、代码示例 - 静态成员函数 一、静态成员函数简介 1、静态成员函数概念 静态成员函数归属 : 在 C 类中 , 静态成员函数 是一种 特殊的函数 , 该函数…

记一次manjaro-i3系统sogoupinying候选词无法正常显示中文(变方框了)问题解决方案

记一次manjaro-i3系统sogoupinying候选词无法正常显示中文&#xff08;变方框了&#xff09;问题解决方案 前言解决方案 前言 今天早上发现公司电脑显卡驱动好像坏了&#xff0c;各种折腾完了干脆把系统搞黑屏无法开机了&#xff0c;时间有限懒再修了&#xff0c;于是重装了系…

【C++面向对象侯捷下】1.导读

文章目录 来源&#xff1a;我的百度网盘 百科全书 专家书籍 C标准库 C编译器

解锁学习新方式——助您迈向成功之路

近年来&#xff0c;随着吉林开放大学广播电视大学的崛起&#xff0c;越来越多的学子选择这所优秀的学府来实现自己的梦想。而作为一名学者&#xff0c;我有幸见证了电大搜题微信公众号的诞生&#xff0c;为广大学子提供了一个全新的学习支持平台。 电大搜题微信公众号&#xff…

解决老版本Oracle VirtualBox 此应用无法在此设备上运行问题

问题现象 安装华为eNSP模拟器的时候&#xff0c;对应的Oracle VirtualBox-5.2.26安装的时候提示兼容性问题&#xff0c;无法进行安装&#xff0c;具体版本信息如下&#xff1a; 软件对应版本备注Windows 11专业工作站版22H222621eNSP1.3.00.100 V100R003C00 SPC100终结正式版…

Android studio安卓生成APK文件安装包方法

1.点击Build->Generate Signed Bundle/APK 2.选择APK 3.首次生成&#xff0c;没有jks文件&#xff0c;就点击Create new。再次生成&#xff0c;直接点Next 4.选择创建jks文件路径 5.点击Next 6.选择release 7.生成完成的apk安装包路径

PostgreSql 统一修改date字段为timestamp

在《Powdersigner PostgreSql 同步表结构到pg数据库》中&#xff0c;导入表结构到pg数据后&#xff0c;发下时间对不上了。mysql的datetime转换后pg的变成了date了。 再同步到数据后&#xff0c;就变成日期类型了。 因为表中基本都有创建时间和修改时间&#xff0c;两个相对固…