分布式事务Seata原理及其项目使用

0.Seata官方文档

1.Seata概念及原理

  • Seata是什么

    • Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
  • Seata主要由三个重要组件组成

    • TC(Transaction Coordinator):事务协调器,管理全局的分支事务的状态,用于全局性事务的提交和回滚
    • TM(Transaction Manager):事务管理器,用于开启、提交或者回滚全局事务
    • RM(Resource Manager):资源管理器,用于分支事务上的资源管理,向TC注册分支事务、上报分支事务的状态、接受TC的命令来提交或者回滚分支事务
      • 传统XA协议实现2PC方案的RM是在数据库层,RM本质上就是数据库自身
      • Seata的RM是以jar包的形式嵌入在应用程序里面
  • 架构理解:TC为单独部署的Server服务端,TM和RM为嵌入到应用中的Client客户端

    在这里插入图片描述

  • 其它术语

    • XID:TM请求TC开启一个全局事务,TC会生成一个XID作为该全局事务的编号,XID会在微服务的调用链路中传播,保证将多个微服务的子事务关联在一起
  • Seata事务处理过程描述

    1. A服务的TM向TC申请开启(begin)一个全局事务,全局事务创建成功并生成一个全局唯一的XID
    2. A服务的RM向TC注册分支事务
    3. A服务执行分支事务,对数据库进行操作
    4. A服务远程调用B服务,并把XID在微服务调用链路的上下文中传播
    5. B服务的RM向TC注册分支事务,并将其纳入XID对应的全局事务的管辖
    6. B服务执行分支事务,对数据库进行操作
    7. 全局事务调用链处理完毕,TM根据有无异常向TC发起针对XID的全局提交(commit)或回滚(rollback)决议
    8. TC调度XID下管辖的全部分支事务完成提交(commit)或回滚(rollback)请求
  • Seata实现分布式事务,关键是UNDO_LOG(回滚日志记录表)

    • 在每个应用需要分布式事务的业务库中创建这张表,这个表的核心作用是将业务数据在更新前后的数据镜像组织成回滚日志,保存在UNDO_LOG表中,以便业务异常能随时回滚
  • Seata有四种模式

    • AT

      • AT模式可以应对大多数的业务场景,并且基本可以做到无业务入侵,开发者无感知

      • 用户只需关心自己的业务SQL,AT模式分为两个阶段,可以认为是2PC

        • 一阶段:执行用户SQL

          • Seata会拦截业务SQL,找到业务SQL要更新的业务数据,在业务数据被更新前,将其保存为before image,然后执行业务SQL更新业务数据
          • 在业务数据更新之后,再将其保存成after image,最后生成行锁
          • 以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性
        • 二阶段:Seata框架自动生成提交或者回滚

          • 二阶段提交:因为业务SQL在一阶段已经提交至数据库,所以Seata框架只需将一阶段保存的快照数据和行锁删掉,完成数据清理即可
          • 二阶段回滚:还原业务数据,回滚方式便是用before image 还原业务数据;但在还原前要校验脏写,对比数据库当前业务数据和after image,如果两份数据完全一致就说明没有脏写,出现脏写就需要转人工处理
    • TCC

    • Sage

    • XA

2.Seata使用基于AT模式

  • 创建undo_log表,每个库都需要

    CREATE TABLE IF NOT EXISTS `undo_log`
    (`branch_id`     BIGINT       NOT NULL COMMENT 'branch transaction id',`xid`           VARCHAR(128) NOT NULL COMMENT 'global transaction id',`context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',`rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',`log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',`log_created`   DATETIME(6)  NOT NULL COMMENT 'create datetime',`log_modified`  DATETIME(6)  NOT NULL COMMENT 'modify datetime',UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';
    ALTER TABLE `undo_log` ADD INDEX `ix_log_created` (`log_created`);
    
  • 安装Seata服务器,本人使用docker安装

    docker run -d --name gen-seata \-p 18091:8091 \seataio/seata-server:1.3.0
    
  • TC(事务协调器)需要存储全局事务和分支事务的记录,支持三种存储模式

    • file模式(默认):性能高,适合单机模式,在内存中读写,并持久化到本地文件中
      • 在bin/sessionStore/root.data文件
    • db模式:性能较差,适合TC集群模式
    • redis模式:性能较高,适合TC集群模式
  • 项目添加依赖

    <!--Seata分布式事务:安装服务端版本需与客户端版本保持一致-->
    <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>
    <dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.3.0</version>
    </dependency>
    
  • application.yml文件

    # seata配置
    seata:tx-service-group: gen-user-service-groupservice:grouplist:default: 114.132.67.61:18091vgroup-mapping:gen-user-service-group: default
    
  • 在Service方法上增加注解@GlobalTransactional

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

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

相关文章

SpringBoot整合分页助手

目录 1 导入依赖 2 测试使用 关于分页有些数据 默认访问首页,即默认当前页是 pageNum 1 数据有总条数, total select count(*) 页面大小/每页展示多少条数据, pageSize 10 总页数 , pageCount total / pageSize (需要注意除不尽情况) -- total共7条 select count(*) f…

JAVA基础:值传递和址传递

1 值传递和址传递 值传递 方法调用时&#xff0c;传递的实参是一个基本类型的数据 形参改变&#xff0c;实参不变 public static void doSum(int num1,int num2){} main(){doSum(10,20);int i 10 ;int j 20 ;doSum(i,j) ; } public static void t1(int num){num 20 ;Sys…

[数据集][目标检测]街头摊贩识别检测数据集VOC+YOLO格式758张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;758 标注数量(xml文件个数)&#xff1a;758 标注数量(txt文件个数)&#xff1a;758 标注类别…

苹果手机照片被删除?如何通过不同的方法来恢复照片

手机已经成为我们生活中不可或缺的一部分&#xff0c;它不仅仅是通讯工具&#xff0c;更是我们记录生活点滴的重要工具之一。然而&#xff0c;正如其他任何设备一样&#xff0c;iPhone上存储的照片有时也会不小心被删除或丢失。 别担心&#xff0c;即使你误删了重要的照片&…

opencv 实现两个图片的拼接去重功能

基础知识介绍 cv::Mat 是OpenCV库中用来表示图像和矩阵数据的核心类之一。它是一个多维数组&#xff0c;可以存储图像像素数据、矩阵数据以及其他类型的数据。以下是关于 cv::Mat 类的一些详细解释&#xff1a; 构造函数&#xff1a;cv::Mat 类有多个构造函数&#xff0c;可以用…

安防监控/视频汇聚平台EasyCVR无法启动并报错“error while loading shared libraries”,如何解决?

安防监控/视频汇聚平台EasyCVR视频管理系统以其强大的拓展性、灵活的部署方式、高性能的视频能力和智能化的分析能力&#xff0c;为各行各业的视频监控需求提供了优秀的解决方案。通过简单的配置和操作&#xff0c;用户可以轻松地进行远程视频监控、存储和查看&#xff0c;满足…

Linux学习-inotify和rsync同步

Inotify 是一个 Linux特性&#xff0c;它监控文件系统操作&#xff0c;比如读取、写入和创建。Inotify 反应灵敏&#xff0c;用法非常简单&#xff0c;并且比 cron 任务的繁忙轮询高效得多。 Inotify实际基于事件驱动机制&#xff0c;为应用程序监控文件系统事件提供了实时响应…

JVM系列(五) -内存相关的调优参数

一、摘要 在上篇文章中,我们详细介绍了 JVM 的内存布局。 今天这篇文章,并结合之前的介绍知识,一起了解一下 JVM 内存相关的调优参数。 二、内存设置相关的命令 所有内存溢出的问题,除了代码可能存在问题以外,更直观的问题是内存空间不足,如何通过参数来控制各区域的…

Puppeteer-Cluster:并行处理网页操作的新利器

在现代Web开发和自动化测试领域&#xff0c;高效地处理多个网页操作任务成为了许多开发者和测试工程师的迫切需求。传统的Puppeteer工具虽然功能强大&#xff0c;但在处理大量并发任务时可能会显得力不从心。为此&#xff0c;Puppeteer-Cluster应运而生&#xff0c;作为一个基于…

不小心删除丢失了所有短信?如何在 iPhone 上查找和恢复误删除的短信

不小心删除了一条短信&#xff0c;或者丢失了所有短信&#xff1f;希望还未破灭&#xff0c;下面介绍如何在 iPhone 上查找和恢复已删除的短信。 短信通常都是非正式和无关紧要的&#xff0c;但短信中可能包含非常重要的信息。因此&#xff0c;如果您删除了一些短信以清理 iPh…

030集——自动弹出对话框、选择文件并播放wav音频文件(winform窗体)——C#学习笔记

如图所示&#xff0c;效果如下&#xff1a; 步骤如下&#xff1a; 新建一个winform窗体&#xff0c;双击界面&#xff0c;进入代码区&#xff1a; 复制&#xff08;下面代码中命名空间内的代码&#xff09;到&#xff08;你的命名空间下&#xff09;&#xff0c;运行。 using …

ZBrush入门使用介绍——12、折边

大家好&#xff0c;我是阿赵。   继续介绍ZBrush的功能。   如果拿一个立方体&#xff0c;进行CtrlD增加细分 会出现在边缘的线会被平滑的情况&#xff0c;这时候原来立方体的形状会发生一定的变化&#xff0c;不能保持原来的形状。 如果立方体真的只有8个顶点&#xff0…

266-基于Xilinx Kintex-7 XC7K325T 的12路光纤Switch交换平台

一、板卡概述 该系统是由两块模块组成&#xff0c;分别是基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片&#xff0c;pin_to_pin兼容FPGAXC7K410T-2FFG900 的模块和一个FPGA夹层卡&#xff08;FMC&#xff09;模块。前者支持64bit DDR3容量2GByte&#xff0c;USB3.0接口;HPC的FMC连…

C++: set与map容器的介绍与使用

本文索引 前言1. 二叉搜索树1.1 概念1.2 二叉搜索树操作1.2.1 查找与插入1.2.2 删除1.2.3 二叉搜索树实现代码 2. 树形结构的关联式容器2.1 set的介绍与使用2.1.1 set的构造函数2.1.2 set的迭代器2.1.3 set的容量2.1.4 set的修改操作 2.2 map的介绍与使用2.2.1 map的构造函数2.…

【尚跑】2024陕西淳化天然氧吧半程马拉松赛149顺利完赛

1、赛事背景 奔跑美丽淳化&#xff0c;畅游天然氧吧。9月8日上午&#xff0c;2024淳化天然氧吧半程马拉松赛在淳化县润镇东街鸣枪开跑&#xff0c;4000名马拉松爱好者相聚美丽淳化&#xff0c;赏荞麦花海、闻硕果飘香&#xff0c;共同开启这场挑战自我、超越极限的奔跑之旅 本次…

游戏的3C,Al

在游戏开发中&#xff0c;“3C”通常指的是三个重要的组成部分&#xff1a;Character&#xff08;角色&#xff09;、Camera&#xff08;摄像机&#xff09;和Control&#xff08;控制&#xff09;。这三者对于创建沉浸式和流畅的游戏体验至关重要。而AI&#xff08;人工智能&a…

flask下https教程

一、定义 linux 下flask https 协议 二、实现 linux 下flask https 协议 生成SSL证书和密钥文件。您可以使用工具如openssl来生成自签名SSL证书和密钥文件。运行以下命令生成证书和密钥文件&#xff1a; openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout…

django实操:换用自建mysql用户表(一次失败的经历)

前言 别想了&#xff0c;基础不扎实的话&#xff0c;还是老老实实用django自带的用户模块吧&#xff01;这是一次耗时而且失败了的经历。 因为是一次失败的经历&#xff0c;这里我给出一些残酷的经验。 实操 重写用户模型 这是我唯一成功的案例&#xff0c;你需要建一个类似如下…

springboot 的共享session方案?

问&#xff1a;springboot 的共享session方案&#xff1f; 参考&#xff1a; https://juejin.cn/post/7195227930077691963分布式之session共享问题 4种解决方案及spring session的使用_分布式session共享方案-CSDN博客 什么是 Session &#xff1f; 答&#xff1a;因为Http协…

JavaScript web API part1

web API 前言 变量声明 const优先&#xff0c;可变再改为let 原因&#xff1a; 语义化更好若以后变量不改变&#xff0c;就应用const声明实际开发中&#xff0c;react框架中基本都是从const [!IMPORTANT] 基本变量中数据若改变&#xff0c;则不可用const 数组&#xff0c;对…