Spring Cloud Alibaba Seata 搭建以及分布式事务的验证

news2024/11/23 18:37:08

文章目录

  • Spring Cloud Alibaba Seata 搭建以及分布式事务的验证
    • 1.seata 简介
    • 2. seata的三大角色
    • 3. Seata的流程
    • 4. Seata AT模式
    • 5. Seata搭建
    • 找到模板案例,照着抄
    • 6. Seata Client快速开始
      • 6.1 声明式事务实现(@GlobalTransactional)
      • 6.2 添加依赖
      • 6.3 各微服务对应配置undo_log表
      • 6.4 测试
      • 6.6 只需要一个公共注解代替原始注解

Spring Cloud Alibaba Seata 搭建以及分布式事务的验证

1.seata 简介

  • Seata(Simple Extensible Autonomous Transaction Architecture)是一种开源的分布式事务解决方案,旨在解决微服务架构下的分布式事务问题。它提供了一套完整的分布式事务管理功能,包括全局事务管理、本地事务协调和分布式事务恢复等。
  • 在传统的单体应用中,使用关系型数据库的事务机制可以确保数据的一致性和隔离性。然而,在微服务架构中,每个微服务都有自己独立的数据库,无法直接使用传统事务进行跨服务的一致性控制。这就导致了分布式事务的挑战。
  • Seata 提供了分布式事务的解决方案,通过引入一个事务协调器(Transaction Coordinator)来协调多个参与者(Participants)之间的本地事务。Seata 支持两阶段提交(Two-Phase Commit)和补偿事务(Compensating Transaction)两种模式。
  • 在 Seata 的架构中,事务发起者(Transaction Coordinator)负责全局事务的创建、提交和回滚,并协调各个参与者的事务操作。参与者(Participants)执行具体的本地事务操作,并与事务协调器进行通信。事务管理器(Transaction Manager)负责协调全局和本地事务的提交和回滚,以及事务的状态管理。
  • Seata 提供了与各种主流数据库和框架的集成支持,例如 MySQL、Oracle、Spring Boot 等,使得在现有的微服务架构中引入分布式事务变得更加方便。

2. seata的三大角色

  • 事务协调者(Transaction Coordinator,TC)- 维护全局和分支事务的状态,驱动全局事务提交或回滚,是整个分布式事务的核心。
  • 事务管理器(Transaction Manager,TM)- 定义全局事务的范围,开始全局事务、提交或回滚全局事务。
  • 资源管理器(Resource Manager,RM)- 管理分支事务处理的资源,与 TC 交流以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
  • 其中,TC 是单独部署的 Server 服务端,TM 和 RM 则是嵌入到应用中的 Client 客户端。由于 TC 是独立的服务端,它与 TM 和 RM 进行通信的接口被称为 RPC(Remote Procedure Call,远程过程调用)接口。具体来讲,TM 和 RM 向 TC 发送关于事务的请求,TC 则根据请求的类型进行相应的响应和操作,从而实现分布式事务的一致性和可靠性。

在这里插入图片描述

3. Seata的流程

  • TM发起一个全局事务请求,请求TC开启一个全局事务。TC为该全局事务生成一个全局唯一的事务ID(XID)gloab_table就是存储的全局事务信息。
  • RM将本地事务注册为该全局事务的分支事务,并通过XID进行关联。RM会与TC进行通信,报告分支事务的状态,分支事务存储在brance_table。
  • TM根据业务逻辑执行相关操作,操作涉及的资源由RM管理。
  • 当TM完成所有操作后,请求TC提交或回滚该全局事务。TC收到请求后,驱动所有参与者(RM)执行相应的提交或回滚操作。每个参与者根据TC的指令将其本地事务提交或回滚

4. Seata AT模式

  • 第一阶段
    业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。核心在于对业务sql进行解析,转换成undolog.
    AT模式官方网址

  • 第二阶段
    1.分布式事务操作成功,则TC通知RM异步删除undolog
    2.分布式事务操作失败,TM向TC发送回滚请求,RM 收到协调器TC发来的回滚请求,通过 XID 和 Branch ID 找到相应的回滚日志记录,通过回滚记录生成反向的更新 SQL 并执行,以完成分支的回滚。

  • 优势
    应用层基于SQL解析实现了自动补偿,从而最大程度的降低业务侵入性;
    将分布式事务中TC(事务协调者)独立部署,负责事务的注册、回滚;
    通过全局锁实现了写隔离与读隔离。

5. Seata搭建

下载seata1.3版本
修改file.conf
在这里插入图片描述

修改register.conf
在这里插入图片描述

找到模板案例,照着抄

案例需要vpn
在这里插入图片描述

复制数据库创建语句自己创建出来,作为保存相关必要的数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
csdn不让上传文件,我将所有需要的文件打包放入网盘
这里的两个文件也在里面
在这里插入图片描述
运行刚才放入的文件
注意nacos这里默认是开启的

  sh nacos-config.sh -h 192.168.14.3  -p 8848 -g SEATA_GROUP

可在windows客户端中查看相应刚刚配置的文件
搭建的nacos的ip加上端口号,必须加上/nacos 账号密码均为nacos
在这里插入图片描述
需要修改
在刚刚打开的网页中找到并修改记得一定要修改时区

  • url

      jdbc:mysql://192.168.14.53:3306/seata——global?useUnicode=true&serverTimezone=UTC
    

username,和password改为自己的
在这里插入图片描述
启动服务
在这里插入图片描述
使用这个命令记得改java的环境变量为java8.

 bin/seata-server.sh   -p 8091  -n 1 
 bin/seata-server.sh   -p 8092  -n 2

在这里插入图片描述

6. Seata Client快速开始

6.1 声明式事务实现(@GlobalTransactional)

接入微服务应用
业务场景:
用户下单,整个业务逻辑由两个微服务构成:

  • 订单服务:根据采购需求创建订单。
  • 库存服务:对给定的商品扣除库存数量。

6.2 添加依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

6.3 各微服务对应配置undo_log表

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,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

6.4 测试

  1. 订单

调用方法后 通过openfeign调用 stock-app的stock接口 记得检查是否注入

@RestController
public class OrderController {
    @Autowired
    OrderItemDao orderItemDao;

    @Autowired
    OrderDao orderDao;
    @Autowired
    StockClient stockClient;

    @PostMapping("/add")
    @GlobalTransactional(name = "addOrder")
    public String add(@RequestBody Ordering ordering){
        String yy = DateUtil.format(DateUtil.date(), "YYYYMMDDHHmmssSSS");
        Long aLong = Long.valueOf(yy);
        ordering.setId(aLong);
        orderDao.addOrderMaster(ordering);
        List<OrderingProduct> products = ordering.getProducts();
        for(OrderingProduct product : products){
            product.setOrderId(aLong);
            orderItemDao.addOrderItem(product);
            stockClient.upQty(product.getProductId(),product.getQty());
        }
        return "yes";
    }
}

这是调用的方法

@GetMapping("/stock")
    @GlobalTransactional(name = "addOrder")
    public String upQty(Integer productId,Integer qty){
        int a = 5/0;
        inventoryDao.updateQty(qty,productId);
        inventoryLogDao.log("产品ID为" + productId + "减少数量" + qty);

        return null;
    }

6.6 只需要一个公共注解代替原始注解

@GlobalTransactional(name = “addOrder”)
俩个一定要有相同的名字,可以共同成功,共同失败

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

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

相关文章

【牛客网】倒置字符串

思路 首先将整个字符串逆序,再分别将每个单词逆序 代码 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void reverse(int begin, int end, char[] array){while(begin < end){char temp array[begin…

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 A: 子 2023

[蓝桥杯 2023 国 B] 子 2023 试题 A: 子 2023 【问题描述】 小蓝在黑板上连续写下从 1 1 1 到 2023 2023 2023 之间所有的整数&#xff0c;得到了一个数字序列&#xff1a; S 12345678910111213 ⋯ 20222023 S 12345678910111213\cdots 20222023 S12345678910111213⋯2…

USB到UART桥接控制器——GP232RNL

GP232RNL是一款高度集成的USB到UART桥接控制器&#xff0c;提供了一种简单的解决方案&#xff0c;可以使用最少的元器件和PCB空间&#xff0c;将RS232接口转换为USB接口。GP232RNL包括一个USB 2.0全速功能控制器、USB收发器、振荡器、EEPROM和带有完整的调制解调器控制信号的异…

Python完整教程

Python由荷兰国家数学与计算机科学研究中心的吉多范罗苏姆于1990年代初设计&#xff0c;作为一门叫作ABC语言的替代品。 [1] Python提供了高效的高级数据结构&#xff0c;还能简单有效地面向对象编程。Python语法和动态类型&#xff0c;以及解释型语言的本质&#xff0c;使它成…

【Hash表】无重复字符的最长字串-力扣 3 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

中国TO B投资,迈入第二周期

2023年,中国TOB正在愈发成熟,迈进第二个周期的趋势已经体现在融资金额上。 作者|斗斗 编辑|皮爷 出品|产业家 TOB&#xff0c;依旧是一级市场的大热门。 统计数据显示&#xff0c;截止2023年8月31日&#xff0c;TOB领域共发生融资事件406起&#xff0c;同比2022年减少…

人工智能核心基础 - 规划和概要

Hi&#xff0c;你好。又见面咯&#xff0c;我是茶桁。 在之前&#xff0c;我花了两个来月的时间撰写了「Python篇」和「数学篇」&#xff0c;希望小伙伴们在正式进入AI之前能够打好一个基础。那么今天开始&#xff0c;我们将正式开始AI基础的学习。 这一节课咱们先不着急直接…

细胞机器人系统中的群体智能

摘要 细胞机器人系统具有“智能”行为能力。本文分析了这种智能的含义。本文根据上述不可思议智能行为的不可预测性来定义机器人智能和机器人系统智能。对不可预测性概念的分析与&#xff08;1&#xff09;统计不可预测、&#xff08;2&#xff09;不可访问、&#xff08;3&am…

STL中string类的实现

目录 引入 构造 | 析构函数 构造函数 析构函数 返回指针的c_str() 求字符大小的size() operator[] 普通对象调用&#xff1a; const对象调用&#xff1a; 迭代器的实现 范围for 深浅拷贝 浅拷贝的不足 实现深拷贝 赋值的深拷贝 传统写法与现代写法 传统写法 现…

前端开发之服务器的基本概念与初识Ajax

1&#xff0c;服务器的基本概念与初识Ajax 1.1 URL地址的组成部分 1.2 客户端与服务器的通信过程 1.3 网页中如何请求数据 1.4 $.get()函数 1.4.1 $.get()函数的语法 // jQuery 中 $.get() 函数的功能单一&#xff0c;专门用来发起 get 请求&#xff0c;从而将服务器上的资源…

Cartesi Rollups在主网上正式启用,推出首个DApp,名为Honeypot

Cartesi的贡献者呼吁所有Web3开发者测试并加固Cartesi Rollups的安全性&#xff0c;因为Honeypot的资金每周以复利增长8% 2023年9月26日&#xff0c;在今天的美国纽约&#xff0c;Cartesi&#xff08;CTSI&#xff09;, 一种具有能够运行Linux发行版的虚拟机的特定应用程序的R…

​cannot import name ‘container_abcs’ from ‘torch._six’​

因为1.8版本之后container_abcs就已经被移除了。 cannot import name ‘container_abcs’ from ‘torch._six’ 解决办法: 改成以下写法&#xff1a; import collections.abc as container_abcs int_classes int

怎么写一个可以拖拽缩放的div?

说在前面 元素拖拽和缩放现在也是一个很常见的功能&#xff0c;让我们从实现div元素的拖拽缩放开始来了解元素拖拽缩放的具体原理和实现方法吧。 效果展示 实现步骤 画一个div 首先我们需要先画一个div&#xff0c;并给它8个方位&#xff08;上、下、左、右、左上、右上、右下…

Linux学习之HIS部署(5)

MySQL部署 #安装MySQL服务 [rootServices ~]# yum clean all; yum repolist -v ... Total packages: 8,265 [rootServices ~]# yum -y install mysql.x86_64 mysql-server.x86_64 mysql-devel.x86_64 ... Complete! [rootServices ~]# #启动MySQL服务 [rootServices ~]# syst…

【数据库——MySQL】(8)表数据插入、修改和删除练习及讲解

目录 1. 题目2. 解答 1. 题目 建立的数据库 YGGL&#xff0c;向库中的 3 个表中插入多行数据记录&#xff0c;然后修改和删除一些记录。 根据下表的样本数据&#xff0c;使用 SQL 语句向 Departments 表中插入数据。 使用 SQL 语句向 Employees 表中插入前 6 条数据。 使用…

Android SeekBar使用避坑指南

这里写自定义目录标题 SeekBar简介问题1.纵向进度条问题2.SeekBar间隙问题3.SeekBar高度设置不生效 SeekBar简介 SeekBar是Android原生UI组件&#xff0c;可以用来调节进度&#xff0c;广泛应用于音乐、视频进度展示调控、音量、亮度调节等功能里。 SeekBar的使用很简单&…

【MySQL】数据类型(一)

文章目录 前言一. tinyint等整型二. bit位字段类型三. float浮点型四. decimal浮点型结束语 前言 MySQL也有数据类型&#xff0c;其中一些与C/C/Java是一样的&#xff0c;但也有一些数据类型不同&#xff0c;更有新的独有的数据类型 一. tinyint等整型 MySQL将整型按照字节分成…

leetcode 33. 搜索旋转排序数组

2023.9.26 本题暴力法可以直接A&#xff0c;但是题目要求用log n的解法。 可以想到二分法&#xff0c;但是一般二分法适用于有序数组的&#xff0c;这里的数组只是部分有序&#xff0c;还能用二分法吗&#xff1f; 答案是可以的。因为数组是经过有序数组旋转得来的&#xff0c;…

Ae 效果:CC Split、CC Split 2

扭曲/CC Split Distort/CC Split CC Split &#xff08;CC 分割&#xff09;主要用于将图像在指定的两点之间进行分割&#xff0c;可以创造出独特的图像分割效果。 ◆ ◆ ◆ CC Split 效果属性说明 Point A 点 A 用于设置分割线的起始点位置。 可手动在查看器面板上拖动来改变…

Linux 线程同步(重要) 互斥量

/*三个窗口卖一百张票 */#include<stdio.h> #include<unistd.h> #include<pthread.h> #include<string.h> int tickets 0; void * sellticket(void * arg) {//卖票usleep(7000);while(tickets < 100) {printf("%ld 正在卖第 %d 张票\n",…