使用Seata实现分布式事务

news2024/9/26 3:29:32

Seata

  • 一:故事背景
  • 二:使用方法
    • 2.1 下载安装Seata
    • 2.4 修改对应配置文件。
      • 2.4.1 配置中心
      • 2.4.1 注册中心
      • 2.4.2 日志保存模式
    • 2.3 启动Seata
    • 2.4 项目中集成
    • 2.5 数据库内新建undo_log 表进行日志记录
    • 2.6 编写代码测试Seata提供的分布式事务功能
  • 三:总结提升

一:故事背景

Seata是一个开源的分布式事务管理系统,用来解决分布式架构下的事务问题。
我们在分布式的系统中,一个业务操作可能设计多个微服务,这些微服务的数据分布在不同的数据库中,当一个操作需要跨过多个数据源执行的时候,某个服务失败了,我们该如何回滚其它已提交的部分呢?我们该如何确保数据一致性呢?
Seata的出现就是从来解决上述问题的,其提供了分布式事务的管理与协调,支持我们在分布式的系统下进行可靠的事务管理。

二:使用方法

2.1 下载安装Seata

2.4 修改对应配置文件。

2.4.1 配置中心

在这里插入图片描述
application.example.yml 里给出了Seata支持的所有配置,类似于一个模板,我们在选择配置的时候,根据此文件中给出的模板即可。

  1. nacos上新建对应的配置文件
    在这里插入图片描述
    找到安装目录下的config.txt文件,将其所有内容都复制到nacos的配置中心,这里的配置都是一些对于Seata项目的配置。这里我们暂时不做修改,直接使用。
    在这里插入图片描述

  2. 修改对应的application.yml 文件
    我们的例子中,将会使用nacos作为配置中心。我们需要将对应的application.example.yml的关于配置中心的配置复制到application.yml,并且进行修改即可。
    在这里插入图片描述
    到这里,对应配置中心我们就设置好了。

2.4.1 注册中心

注册中心的配置流程与配置中心的配置流程相同,我们同样使用nacos作为配置中心。
在这里插入图片描述

2.4.2 日志保存模式

Seata进行分布式事务日志保存的时候,可以使用多种模式,这里我们使用mysql数据库的方式,保存对应的日志.在这里插入图片描述
将对应的配置文件修改好之后,我们就可以启动Seata了

2.3 启动Seata

  1. 找到安装目录,并且进入控制台,然后通过命令启动
    在这里插入图片描述
  2. 启动命令
seata-server.bat -h 127.0.0.1 -p 8091 -m db
  • seata-server.bat: 这是启动 Seata 服务器的脚本文件,通常以 .bat 结尾,表示它是一个 Windows 平台上的批处理文件。在 Linux 或 macOS 等 Unix 类操作系统上可能会使用不同的脚本文件,如 seata-server.sh。

  • -h 127.0.0.1: 这是指定 Seata 服务器的主机地址的参数。在这里,-h 表示主机地址,127.0.0.1 是 IP 地址,表示将 Seata 服务器绑定到本地主机(localhost),只允许本地访问。如果需要允许远程访问,可以指定服务器的公共 IP 地址或主机名。

  • -p 8091: 这是指定 Seata 服务器监听的端口号的参数。在这里,-p 表示端口号,8091 是具体的端口号,表示 Seata 服务器将在 8091 端口上监听来自客户端的连接请求。

  • -m db: 这是指定 Seata 服务器的运行模式的参数。在这里,-m 表示运行模式,db 表示数据库模式。Seata 支持两种运行模式,一种是 db 模式,表示分布式事务日志将存储在数据库中,另一种是 file 模式,表示分布式事务日志将存储在文件中。这里指定的是 db 模式,意味着 Seata 将使用数据库来管理分布式事务。

  1. 成功启动
    在这里插入图片描述
  2. 看一下nacos对应服务
    在这里插入图片描述

2.4 项目中集成

因为我们是测试分布式事务,所以我们应该至少创建两个服务,并且都对Seata进行集成。

  1. Seata对应pom依赖
 <!--seata,推荐用最新版本-->
        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
            <version>1.7.1</version>
        </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>
  1. 其它必备依赖
    我们这里选择jpa作为我们的数据交互层框架。
        <!--        数据库-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.13</version>
        </dependency>

使用nacos做服务注册与发现

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

<!--        nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
  1. 项目配置文件
server:
  port: 7004
  servlet:
    encoding:
      force: true # 强制使用
      charset: UTF-8 # 编码格式
spring:
  application:
    name: module-four
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cloud-demo?autoReconnect=true&useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
    username: root
    password: root666
  cloud:
    nacos:
      discovery:
        server-addr: www.xxxx.top:8848
        namespace: cloud-demo
    sentinel:
      transport:
        port: 9856
        dashboard: localhost:8849
seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos
    nacos:
      server-addr: www.zlovem.top:8848
      namespace: seata
      group: DEFAULT_GROUP
      username: nacos
      password: nacos
      context-path:
      ##if use MSE Nacos with auth, mutex with username/password attribute
      #access-key:
      #secret-key:
      data-id: seata
  registry:
    type: nacos
    nacos:
      application: seata-server
      server-addr: www.zlovem.top:8848
      group : "DEFAULT_GROUP"
      namespace: "seata"

通过上述两种方式新建两个对应服务。

2.5 数据库内新建undo_log 表进行日志记录

我们需要在我们项目连接的数据库中新建一张对应的undo_log 表来记录日志。这个表的作用是记录一次事务过程中,不同的服务,对数据库的操作。
实际上集成了Seata之后,不同的微服务之间并不是等所有调用完所有的微服务之后在进行事务提交,将数据持久化,实际上其是会将数据先进行提交,然后再出现异常的时候,才会将对应的数据回滚回去。

CREATE TABLE `undo_log` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `branch_id` bigint NOT NULL,
  `xid` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
  `context` varchar(128) CHARACTER SET utf8mb3 COLLATE utf8mb3_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 AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;

2.6 编写代码测试Seata提供的分布式事务功能

  1. 项目A代码
    @GetMapping("/seata")
    @GlobalTransactional//全局事务控制注解
    public void seata(){
        System.out.println("测试测试seata");
        User user = new User();
        user.setName("郝");
        userDao.save(user);
        moduleFourFegin.testStata();
    }
  1. 项目B代码
    @GetMapping("/testStata")
    void testStata() throws Exception {
        System.out.println("我直接抛出异常,看看回滚不回滚");

        //保存数据
        User user = new User();
        user.setName("服务四存储数据");
        userDao.save(user);

        throw new Exception("分布式事务太牛了");
    }

在上述给出的代码中,我们在服务A中使用了Seata提供的 @GlobalTransactional 全局事务注解,并且在服务B中,直接将对应的异常抛出,看看其会不会实现回滚的效果。
3. 启动项目并且进行测试
当代码走到以下位置:
在这里插入图片描述
数据库中对应的数据:
在这里插入图片描述
当用户走到以下位置:
在这里插入图片描述
数据库数据:
在这里插入图片描述
用户抛出异常后,数据库数据:
在这里插入图片描述
通过上述结果,我们可以观察到,分布式事务生效了,跨服务之间出现错误之后,可以实现数据的回滚,实现了跨服务之间的数据控制。

三:总结提升

本文只是一篇基础介绍,介绍如何使用Seata,关于Seata的的原理,进阶,我们会在接下来的博客中持续更新~

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

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

相关文章

带你熟练使用list

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

EdgeX Foundry MQTT设备服务

一、部署edgex 1.运行命令行&#xff0c;进入放置docker-compose-fuji-no-secty.yml文件的路径下 下载到本地的docker-compose文件 执行&#xff1a; docker-compose -f docker-compose-fuji-no-secty.yml pull 拉取相关镜像&#xff0c;这里默认将文件中没有注释的服务镜像全部…

企业注册版 :ag-Grid Enterprise 30.1.0

Ag-Grid 被描述为一种商业产品&#xff0c;已根据 EULA 进行分发&#xff0c;并受到我们提供的技术团队的鼓励。它非常高级&#xff0c;具有与行分组一样的性能以及范围选择、主数据和案例、行的服务器端模型等等。Ag-Grid Enterprise 通常附带集成图表&#xff0c;允许用户和开…

无涯教程-JavaScript - IFS函数

描述 IFS函数检查是否满足一个或多个条件,并返回与第一个TRUE条件相对应的值。此功能已在Excel 2016中添加。 语法 IFS (logical_test1, value_if_true1, [logical_test2, value_if_true2], [logical_test3, value_if_true3]…) 争论 Argument描述Required/Optionallogical…

无涯教程-JavaScript - ATAN函数

描述 The ATAN function returns the arctangent, or inverse tangent, of a number. The returned angle is given in radians between -π/2 and π/2. The arctangent is the angle whose tangent is number. 语法 ATAN (number)争论 Argument描述Required/OptionalNumb…

springboot配置注入增强(二)属性注入的原理

一 原理 1 配置的存储 springboot在启动的时候会后构建一个org.springframework.core.env.Environment类型的对象&#xff0c;这个对象就是用于存储配置&#xff0c;如图springboot会在启动的最开始创建一个Environment对象 这个webApplicationType的枚举是在new SpringAppli…

Learn Prompt-Midjourney 图片生成

简介 随着 ChatGPT 的爆火&#xff0c;越来越多的人开始关注并尝试 AI 相关的应用。而图片生成就是其中一个备受瞩目的领域。目前已经有许多图像生成工具&#xff0c;如 Midjourney&#xff0c;Stable Diffusion&#xff0c;DALL-E&#xff0c;Firefly等。本课程主要是以 Midj…

Python 变量的类型注解

视频版教程 Python3零基础7天入门实战视频教程 类型注解 前面有个示例&#xff0c;我们函数参数是字符串类型&#xff0c;但是pycharm工具不知道&#xff0c;所以不会给我们提示s的方法&#xff0c;我们只能人工手写&#xff0c;效率大大降低。 类型注解&#xff1a; 在代码中…

心法利器[101] | 从大模型到大模型系统

心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会&#xff0c;与大家一起成长。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。 2022年新一版的文章合集已经发布&#xff0c;累计已经60w字了&#xff0c;获取方式看这里&…

使用ElementPlus实现内嵌表格和内嵌分页

前言 有时遇到这样的需求&#xff0c;就是在表格里面嵌入一个表格&#xff0c;以及要求带有分页&#xff0c;这样在ElementPlus中很好实现。以下使用Vue2语法实现一个简单例子&#xff0c;毕竟Vue3兼容Vue2语法&#xff0c;若想要Vue3版本例子&#xff0c;简单改改就OK了。 一…

数据结构——图的应用

文章目录 前言一、图的应用1. 最小生成树普里姆&#xff08;Prim&#xff09;算法克鲁斯卡尔&#xff08;Kruskal&#xff09;算法 2. 最短路径Dijkstra算法求单源最短路径 3. 拓扑结构4. 关键路径 总结 前言 图的应用 1.1 最小生成树 1.2 最短路径 1.3 拓扑结构 1.4 关键路径…

【网络教程】揭秘Windows SSH服务端免密登录:告别繁琐,享受安全连接

文章目录 开启Windows下的SSH服务端图形界面安装手动下载安装Windows如何查看系统用户名Windows如何查看本机IP开启免密登录Window生成秘钥Linux下生成秘钥配置公钥视频讲解开启Windows下的SSH服务端 这篇文章演示的环境是Windows11Windows的SSH服务端默认情况下是没有安装的,…

9.项目细节调整

文章目录 学习资料项目整体细节调整处理首页 学习资料 https://www.bilibili.com/video/BV13g411Y7GS/?p24&spm_id_frompageDriver&vd_sourceed09a620bf87401694f763818a31c91e 项目整体细节调整 处理首页 默认的首页 肯定不能给人看。文件在这个位置。 可以删除…

live555 BasicUsageEnvironment目录解读

文章目录 BasicUsageEnvironmentBasicHashTable.cppBasicTaskScheduler.cppBasicTaskScheduler0.cppBasicUsageEnvironment.cppBasicUsageEnvironment0.cppDelayQueue.cpp后续会进行更新 BasicUsageEnvironment ├── BasicHashTable.cpp ├── BasicTaskScheduler0.cpp ├─…

类加载器 - 双亲委派模型

文章目录 回顾一下类加载过程类加载器类加载器介绍类加载器加载规则类加载器总结自定义类加载器 双亲委派模型双亲委派模型介绍双亲委派模型的执行流程双亲委派模型的好处打破双亲委派模型方法 本文参考&#xff1a; 类加载器详解&#xff08;重点&#xff09; | JavaGuide(Ja…

多目标优化算法:基于非支配排序的海象优化算法(NSWOA)MATLAB

一、海象优化算法WOA 海象优化算法&#xff08;Walrus Optimization Algorithm&#xff0c;WOA&#xff09;由Trojovsk等人于2023年提出&#xff0c;该算法模拟海象的进食&#xff0c;迁移&#xff0c;逃跑和对抗捕食者的过程&#xff0c;WOA包含探索、迁移和开发三个阶段&…

正则表达式学习和高级用法

以下所有的验证都在 在线验证 1. 起始符 / 正则表达式的起始符2. 限定符 匹配前面的子表达式**1次或多次**。例如&#xff0c;zo 能匹配 "zo" 以及"zoo"&#xff0c;但不能匹配 "z"。等价于 {1,}。 ? 匹配前面的子表达式**0次或1次**。例如…

二进制 Deploy Kubernetes v1.23.17 超级详细部署

文章目录 1. 预备条件2. 基础配置2.1 配置root远程登录2.2 配置主机名2.3 安装 ansible2.4 配置互信2.5 配置hosts文件2.6 关闭防firewalld火墙2.7 关闭 selinux2.8 关闭交换分区swap2.9 修改内核参数2.10 安装iptables2.11 开启ipvs2.12 配置limits参数2.13 配置 yum2.14 配置…

函数防抖和节流

函数防抖和节流 经典真题 防抖&#xff0c;节流是什么&#xff0c;如何实现 &#xff08;字节&#xff09; 什么是函数防抖和节流 JavaScript 中的函数大多数情况下都是由用户主动调用触发的&#xff0c;除非是函数本身的实现不合理&#xff0c;否则一般不会遇到跟性能相关…

DMA简单总结

文章目录 一、基础概念1.1 DMA---Direct Memory Access 直接存储器访问&#xff0c;目的减少CPU资源占用 二、典型DMA硬件模型2.1 基本硬件特性---通道数、源/目标类型&#xff0c;地址与累加方式&#xff0c;数据位宽&#xff0c;搬移长度&#xff0c;循环模式&#xff0c;中断…