SpringCloud:分布式事务Seata事务模式

news2024/12/22 19:39:38

Seata会有 4 种分布式事务解决方案,分别是AT模式、TCC模式、Saga模式和XA模式。

在这里插入图片描述

1.AT 模式

2019 年 1 月份,Seata开源了AT模式。AT模式是一种无侵入的分布式事务解决方案。在AT模式下,用户只需关注自己的业务SQL,用户的 业务SQL 作为一阶段,Seata框架会自动生成事务的二阶段提交和回滚操作。

在这里插入图片描述

1.1.前提

  • 基于支持本地ACID事务的关系型数据库。
  • Java应用,通过 JDBC访问数据库。

1.2.整体机制

两阶段提交协议的演变:

  • 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
  • 二阶段:
    • 提交异步化,非常快速地完成。
    • 回滚通过一阶段的回滚日志进行反向补偿。

在一阶段,Seata会拦截业务SQL,首先解析SQL语义,找到业务SQL要更新的业务数据,在业务数据被更新前,将其保存成before image,然后执行业务SQL更新业务数据,在业务数据更新之后,再将其保存成after image,最后生成行锁。以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性。

在这里插入图片描述

二阶段如果是提交的话,因为业务SQL 在一阶段已经提交至数据库, 所以Seata框架只需将一阶段保存的快照数据和行锁删掉,完成数据清理即可。

在这里插入图片描述

二阶段如果是回滚的话,Seata就需要回滚一阶段已经执行的业务SQL,还原业务数据。回滚方式便是用**before image还原业务数据;但在还原前要首先要校验脏写,对比数据库当前业务数据**和 after image,如果两份数据完全一致就说明没有脏写,可以还原业务数据,如果不一致就说明有脏写,出现脏写就需要转人工处理。

在这里插入图片描述

AT模式的一阶段、二阶段提交和回滚均由Seata框架自动生成,用户只需编写业务SQL,便能轻松接入分布式事务,AT模式是一种对业务无任何侵入的分布式事务解决方案。

2.TCC模式

2019 年 3 月份,Seata开源了TCC模式,该模式由蚂蚁金服贡献。TCC模式需要用户根据自己的业务场景实现 TryConfirmCancel三个操作;事务发起方在一阶段 执行Try方式,在二阶段提交执行Confirm方法,二阶段回滚执行Cancel方法。

在这里插入图片描述

TCC三个方法描述:

  • Try:资源的检测和预留;
  • Confirm:执行的业务操作提交;要求Try成功Confirm一定要能成功;
  • Cancel:预留资源释放。

业务模型分 2 阶段设计:

用户接入TCC,最重要的是考虑如何将自己的业务模型拆成两阶段来实现。

扣钱场景为例,在接入TCC前,对A账户的扣钱,只需一条更新账户余额的SQL便能完成;但是在接入TCC之后,用户就需要考虑如何将原来一步就能完成的扣钱操作,拆成两阶段,实现成三个方法,并且保证一阶段Try成功的话 二阶段Confirm一定能成功。

在这里插入图片描述

如上图所示,

Try方法作为一阶段准备方法,需要做资源的检查和预留。在扣钱场景下,Try要做的事情是就是检查账户余额是否充足,预留转账资金,预留的方式就是冻结A账户的 转账资金。Try方法执行之后,账号A余额虽然还是 100,但是其中 30 元已经被冻结了,不能被其他事务使用。

二阶段Confirm方法执行真正的扣钱操作。Confirm会使用Try阶段冻结的资金,执行账号扣款。Confirm方法执行之后,账号A在一阶段中冻结的 30 元已经被扣除,账号A余额变成 70 元 。

如果二阶段是回滚的话,就需要在Cancel方法内释放一阶段Try冻结的 30 元,使账号A的回到初始状态,100 元全部可用。

用户接入TCC模式,最重要的事情就是考虑如何将业务模型拆成 2 阶段,实现成TCC的 3 个方法,并且保证Try成功Confirm 一定能成功。相对于AT模式,TCC模式对业务代码有一定的侵入性,但是TCC模式无AT模式的全局行锁,TCC性能会比AT模式高很多。

3.Saga模式

Saga模式是Seata提供的长事务解决方案,由蚂蚁金服主要贡献。在Saga模式下,分布式事务内有多个参与者,每一个参与者都是一个冲正补偿服务,需要用户根据业务场景实现其正向操作和逆向回滚操作。

分布式事务执行过程中,依次执行各参与者的正向操作,如果所有正向操作均执行成功,那么分布式事务提交。如果任何一个正向操作执行失败,那么分布式事务会去退回去执行前面各参与者的逆向回滚操作,回滚已提交的参与者,使分布式事务回到初始状态。

在这里插入图片描述

Saga模式下分布式事务通常是由事件驱动的,各个参与者之间是异步执行的,Saga模式是一种长事务解决方案。

3.1.适用场景

  • 业务流程长、业务流程多
  • 参与者包含其它公司或遗留系统服务,无法提供TCC模式要求的三个接口

3.2.优势

  • 一阶段提交本地事务,无锁,高性能
  • 事件驱动架构,参与者可异步执行,高吞吐
  • 补偿服务易于实现

3.3.缺点

  • 不保证隔离性

4.XA模式

XA模式是Seata将会开源的另一种无侵入的分布式事务解决方案,任何实现了XA协议的数据库都可以作为资源参与到分布式事务中,目前主流数据库,例如MySqlOracleDB2Oceanbase等均支持XA协议。

XA协议有一系列的指令,分别对应一阶段和二阶段操作。 xa startxa end用于开启和结束XA事务;xa prepare 用于预提交XA事务,对应一阶段准备;**xa commitxa rollback**用于提交、回滚XA事务,对应二阶段提交和回滚。

XA模式下,每一个XA事务都是一个事务参与者。分布式事务开启之后,首先在一阶段执行 xa start业务SQLxa endxa prepare 完成XA事务的执行和预提交;二阶段如果提交的话就执行 xa commit,如果是回滚则执行xa rollback。这样便能保证所有XA事务都提交或者都回滚。

在这里插入图片描述

XA模式下,用户只需关注自己的业务SQLSeata框架会自动生成一阶段、二阶段操作;XA模式的实现如下:

在这里插入图片描述

  • 一阶段:

XA模式的一阶段,Seata会拦截业务SQL,在业务SQL之前开启XA事务(xa start),然后执行业务SQL,结束XA事务**xa end,最后预提交XA事务(xa prepare**),这样便完成 **业务SQL**的准备操作。

  • 二阶段提交:

执行**xa commit指令,提交XA事务,此时业务SQL**才算真正的提交至数据库。

  • 二阶段回滚:

执行**xa rollback指令,回滚XA事务,完成业务SQL**回滚,释放数据库锁资源。

XA模式下,用户只需关注业务SQLSeata会自动生成一阶段、二阶段提交和二阶段回滚操作。XA模式和AT模式一样是一种对业务无侵入性的解决方案;但与AT模式不同的是,XA模式将快照数据和行锁等通过 XA指令委托给了数据库来完成,这样XA模式实现更加轻量化。

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

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

相关文章

2023-06-16 Android app 使用opencv 调用jni在图片上添加文字,对图片进行模糊处理,源码实例学习。

一、要理解还是得自己看代码 1.1 完整的测试代码路径如下 https://download.csdn.net/download/qq_37858386/87916944 1.2 代码架构 1.3 app 运行效果 二、android studio 添加 opencv module可以参考下面的文章,比较详细。 Android OpenCV 入门教程笔记&#x…

华为OD机试真题 JavaScript 实现【计算最大乘积】【2022Q4 100分】,附详细解题思路

一、题目描述 给定一个元素类型为小写字符串的数组&#xff0c;请计算两个没有相同字符的元素长度乘积的最大值&#xff0c; 如果没有符合条件的两个元素&#xff0c;返回0。 二、输入描述 输入为一个半角逗号分隔的小写字符串的数组&#xff0c;2 < 数组长度<100&am…

Linux之RPM管理工具

目录 Linux之RPM管理工具 定义 作用 RPM软件包 RPM软件包的经典命名格式 RPM安装 语法格式 参数及作用 有关rpm包相关网站 RPM查询功能 语法格式 参数及作用 案例 rpm软件包安装 软件包升级 rpm软件包卸载 rpm卸载 强制卸载 rpm包签名验证 用途 查看签名 …

程序员如何转型成为个人开发者

作者&#xff1a;哈桑c&#xff08;CSDN平台&#xff09; 文章目录 1、什么是个人开发者&#xff1f;2、个人开发者如何赚钱&#xff1f;3、程序员如何转型成为个人开发者&#xff1f;4、成为个人开发者需要学习哪些技能&#xff1f;结语 1、什么是个人开发者&#xff1f; 个人…

redhat安装oracle11g单实例软件建库

1、打开xmanager-passive 2、oracle 用户登录&#xff0c;开始安装 [rootrhel64 database]# su - oracle [oraclerhel64 ~]$ evn |grep oracle -bash: evn: command not found [oraclerhel64 ~]$ evn | grep oracle -bash: evn: command not found [oraclerhel64 ~]$ env | g…

首次使用云服务器搭建网站(三)

上回说到&#xff0c;我们已经搞定了服务器问题和网站模板问题&#xff0c;接下来只需要上传模板即可。 一、上传网站代码 1、打开宝塔面板&#xff0c; 点开文件、这里就是我们服务器的所有文件了。 2、依次点击WWW文件夹、wwwroot文件夹、域名文件夹&#xff0c;进入…

Python之私有属性、私有方法、装饰器及属性和类的命名规则

一、私有属性和私有方法(实现封装) Python对于类的成员没有严格的访问控制限制&#xff0c;这与其他面向对象语言有区别。关于私有属性和私有方法&#xff0c;有如下要点&#xff1a; 通常我们约定&#xff0c;两个下划线开头的属性是私有的(private)。其他为公共的(public)。…

Centos环境 使用docker 部署MySQL 8.X详细版本

文章目录 安装docker配置docker 阿里镜像加速阿里云容器镜像服务ACR配置镜像源 安装部署MySQL拉取MySQL镜像创建挂载文件测试部署部署MySQL进入容器将它的mysql配置同步给宿主机删除test1测试容器 正式部署MySQL查看正式部署的容器状态配置远程连接字符集以及关闭跳过密码验证等…

Aop详解

AOP简介 AOP是一种编程思想&#xff0c;就如同面向对象这种编程思想一样&#xff0c;是一种编程范式&#xff0c;用来指导开发者如何组织程序更好的运行 AOP&#xff08;面向切面编程&#xff09; 作用&#xff1a;在不改变原代码的前提下&#xff0c;为其增加功能。 连接点…

基于 Yeoman 脚手架技术构建前端项目的实践

NodeJ、CLI 基于 Yeoman 脚手架技术构建前端项目的实践 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details…

torch.optim.lr_scheduler.OneCycleLR 学习与理解

一、功能和参数 1.1、通过图像直观地理解 OneCycleLR 的过程&#xff1a; 补充&#xff1a; 生成该图像的代码&#xff1a; 来自&#xff1a;torch.optim.lr_scheduler.OneCycleLR用法_dxz_tust的博客-CSDN博客 import cv2 import torch.nn as nn import torch from torchv…

Nodejs二、内置模块

零、文章目录 Nodejs二、内置模块 1、fs 文件系统模块 &#xff08;1&#xff09;fs 文件系统模块是什么 fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性&#xff0c;用来满足用户对文件的操作需求。 fs.readFile() &#xff1a;用来读取指…

【深度学习-第2篇】CNN卷积神经网络30分钟入门!足够通俗易懂了吧(图解)

网络上有着很多关于CNN入门的教程&#xff0c;但是总还是觉得缺少足够简易、直观、全面的文章&#xff0c;能让人通读下来酣畅淋漓&#xff0c;将CNN概念尽收囊中。本篇文章就想尝试一下&#xff0c;真正地带小白同学们轻松入门。 这篇文章包含很多图片&#xff0c;为了花这些…

k8s-containerd容器运行时默认50G存储位置更换

containerd作为k8s主要的cri&#xff0c;它默认存储位置是使用的/根目录挂载的资源。当容器运行的越来越多&#xff0c;默认的50G不够使用了。有2种方法可以进行解决。 方式1、增加/根分区的磁盘空间。 方式2、修改containerd配置文件&#xff0c;修改默认配置为/home 这里我…

【汤4操作系统】深入理解信号量的使用-三大问题的变体

主要从生产者消费者、读写者、哲学家问题中的经典变体进行讲述&#xff0c;均使用伪代码实现 生产者消费者变体 顾客看作是生产出的产品&#xff0c;理发师看作是消费者&#xff0c;沙发有空位&#xff0c;顾客就进去&#xff0c;沙发有顾客&#xff0c;理发师就去理发 和生产者…

Redis客户端 - Jdies快速入门

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis客户端 - Jdies快速入门 | CoderMast编程桅杆Redis客户端 - Jdies快速入门 简介 Jedis is a Java client for Redis designed for performance and ease of use. Jedis是Redis 的 Java 客户端&#xff0c;专为性能和易…

Python中使用matplotlib绘制各类图表示例

折线图 折线图是一种用于表示数据随时间、变量或其他连续性变化的趋势的图表。通过在横轴上放置时间或如此类似的连续变量&#xff0c;可以在纵轴上放置数据点的值&#xff0c;从而捕捉到数据随时间发生的变化。折线图可以用于比较不同变量的趋势&#xff0c;轻松地发现不同的…

不写代码如果解决Jmeter跨线程组取参数值问题?

目录 前言 定义属性法 文件转接法 总结&#xff1a; 前言 如果你工作中已经在用jmeter做接口测试&#xff0c;或性能测试了&#xff0c;你可能会遇到一个麻烦。 那就是jmeter的变量值不能跨线程组传递。 看&#xff0c;官方就已经给出了解释&#xff1a; 这个不是jmeter的…

机器学习——识别足球和橄榄球

一、选题的背景 橄榄球起源于足球&#xff0c;二者即相似又有所区别。计算机技术发展至今&#xff0c;AI技术也有了极大的进步&#xff0c;通过机器学习不断的训练&#xff0c;AI对于足球和橄榄球的识别能力可以帮助人们对足球和橄榄球的分辨。机器学习是一种智能技术&#xff…

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql

文章目录 一、问题引入 二、问题分析 三、问题解决 ​四、总结 一、问题引入 今天是学习谷粒商城的第一天&#xff0c;既然是第一天&#xff0c;肯定就是先对项目先有个基本的了解&#xff0c;比如是项目所用到的技术栈&#xff0c;项目整体的架构等&#xff0c;还对分布…