分布式事务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,一经查实,立即删除!

相关文章

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;满足…

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

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

不小心删除丢失了所有短信?如何在 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;共同开启这场挑战自我、超越极限的奔跑之旅 本次…

flask下https教程

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

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;对…

计算机毕业设计Python+Tensorflow股票推荐系统 股票预测系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

《Tensorflow股票预测系统》开题报告 一、研究背景与意义 随着信息技术的飞速发展和金融市场的日益复杂化&#xff0c;股票作为金融市场的重要组成部分&#xff0c;其价格波动受到广泛关注。传统的股票预测方法如技术分析和基本面分析&#xff0c;虽然在一定程度上能够辅助投…

如何查询、统计品牌在社媒平台的品牌声量?

现在各平台的竞争越来越激烈&#xff0c;企业想做好在社媒平台上的品牌营销&#xff0c;就需要时刻监测品牌声量的大小&#xff0c;比如企业品牌声量趋势、品牌sov值、搜索指数等相关指标&#xff0c;辅助衡量品牌宣传效果如何。那怎么去查询统计品牌声量情况呢&#xff1f;可以…

获取多行文本内容,去掉首尾空格、去掉空字符串,解析为文本数组

核心代码 // 获取多行文本内容&#xff0c;去掉首尾空格、去掉空字符串&#xff0c;解析为文本数组 getMultiLineTexts(textareaValue) {return textareaValue.split("\n").map((v) > v.split("\t").join("").trim()).filter((v, i, ar) &g…

数据库的操作:SQL语言的介绍

一.前言 SQL是一种结构化查询语言。关系型数据库中进行操作的标准语言。 二.特点 ①对大小写不敏感 例如&#xff1a;select与Select是一样的 ②结尾要使用分号 没有分号认为还没结束; 三.分类 ①DDL&#xff1a;数据定义语言&#xff08;数据库对象的操作&#xff08;结…

uniapp设置微信小程序的交互反馈

链接&#xff1a;uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗&#xff1a; title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon&#xff1a;error是设置我们失败的logo 设置的文字上…