SpringCloud Alibaba-Seata

2023-09-22 15:14:17
接上文 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本书。

更多推荐

用tkinter+selenium做一个CSDN热榜爬虫

文章目录UI设计函数封装功能实现自从学会了分析热榜,就是CSDN热榜分析,每天都要爬下来分析一下热榜都在干什么。但脚本运行到底还是不方便,所以接下来就想办法将其做成一个带有界面的热榜爬虫UI设计做一个热榜爬虫的交互式界面,只需要两个按钮外加两个信息框就足够了,所以布局极其简单classTestSTL:def__init

数据融合的并行计算

1、数据融合的算法数据融合的算法当中,需要对每一个格点i进行逐个计算,公式如下2、出现的问题但是随着背景场的空间分辨率的提高,格点数急剧增加。如空间分辨率为0.01°的话,那么15°✖15°的空间范围内就有1500✖1500个格点。那么在进行逐个格点计算的过程中,就非常耗时间。3、编程我先按照逐点计算并赋值给DataA

布隆过滤器(Bloom Filter)

一,布隆过滤器介绍布隆过滤器(BloomFilter)是一个很长的二进制向量(位图BitMap)和一系列随机映射函数(Hash函数)。它是一种数据结构,可以判断一个元素一定不在集合中或可能存在于集合中。优点:相比于传统的list、set、map等数据结构,它更高效、占用空间更少。缺点:存在误判率二,布隆过滤器原理布隆过

如何保护人工智能隐私?

本文旨在帮助这些消费者建立有关人工智能隐私功能的更深入的知识库。此外,它还为企业主和领导者提供了指南,帮助他们更好地了解客户的担忧,以及如何在不牺牲功能的情况下保护隐私的方式使用人工智能。尽管企业和消费者都对人工智能改变日常生活的潜力感到兴奋,但人工智能的广泛使用所带来的隐私问题仍是一个主要问题。显然,随着越来越多的个

2023上海工博会,正运动展位现场直击(二)

9月21日,上海工博会已经成功开展了2天,热度仍旧不减,正运动技术展位6.1H-E261不仅吸引了大量工业自动化专业人士,而且也为他们呈现了一系列令人印象深刻的产品和运动控制解决方案。其中,高性能软硬件产品引发了广泛关注。一、活动现场产品宣讲活动也成为展位上的一大亮点,正运动技术的产品工程师团队分享了最新的运动控制解决

制作游戏demo的心得

制作这个游戏demo出来的心得制作游戏demo的心得制作游戏demo,主要是为了表现自己的技术,那就一门心思想着如何提高表现力就行了,在整体的画面渲染风格方面或许没有什么可选择的,市面上资料最多最成熟的只有卡通渲染,shader自己写要写的东西太多,不如不写,写了也没别人的好看,用什么模型就用什么模型的shader,地

【从0学习Solidity】 16. 函数重载

【从0学习Solidity】16.函数重载博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!本文收录于不写代码没饭吃的学习汇报系列,大家有兴趣

android AudioRecord

AudioRecord是Android中用于音频录制的类,它的主要作用是捕获来自设备麦克风或其他音频源的音频数据,并将其保存为PCM格式的音频流,以供后续处理或存储。以下是关于AudioRecord的一些常见用途和基本使用方法:作用和用途:音频录制:AudioRecord可以用于录制来自麦克风、耳机麦克风或其他音频输入

安卓机型-MTK芯片掉串码 掉基带 如何用工具进行修复 改写参数

在早期MTK芯片机型中较多使用APBP方式来修复mtk芯片机型的串码。目前MTK机型对于丢基带掉串码问题大都使用MODEMMETA工具来进行修复串码或者改写参数。今天以一款mtk芯片机型来做个演示,高通芯片类的可以参考;高通改串相关工具仅支持在联发科芯片组上运行的设备,无论是智能手机还是平板电脑。它不适用于联发科以外的

vue模板语法(上集)

为什么要用Vue模板语法Vue模板语法是Vue.js框架的一部分,使用它有以下几个优点:简化了HTML代码编写:Vue模板语法支持简化HTML标签和属性的写法,使得代码更加简洁易读,提高开发效率。数据绑定:Vue模板语法支持数据双向绑定,可以将数据自动更新到对应的DOM元素,从而避免了手动操作DOM的麻烦。条件渲染:V

为Electron-log 设置日志颜色

使用Electron-log为你的Electron应用添加日志颜色在Electron应用中,有效的日志记录是一项不可或缺的任务,它可以帮助你跟踪应用程序的运行状况、调试问题以及监视用户体验。为了提高日志的可读性,你可以使用Electron-log以及Node.js中的Chalk模块来为不同的日志级别添加颜色和样式。安装

热文推荐