Seata强一致性事务模式XA的设计理念

news2024/11/14 13:28:25

承接上文分布式事务Seata-AT模式

XA规范是什么?

  • 是分布式事务处理DTP(Distributed Transaction Processing)的标准。
  • 是描述全局的事务管理器和局部的资源管理器之间的接口规范。
  • 允许多个资源(如数据库、应用服务、消息队列)在同一个事务中访问,使ACID属性跨应用程序而保持有序。
  • 本质上可以理解为2PC,使用了2PC协议来保证所有的资源同时提交或回滚特定事务。
  • 数据库本身支持本地事务ACID,XA让ACID库外应用。

DTP模式定义的几个角色?

  • AP 应用程序
  • RM 资源管理器,事务的参与者,具体的一个一个的微服务对应的数据源。
  • TM 事务管理器,管理整个事务生命周期并协调各个RM。

  • AP应用程序,比如订单服务、库存服务。
  • RM资源管理器,可以理解为一个数据库mysql,应用程序通过JDBC连接,AP通过RM对资源进行控制,资源必须实现XA定义的接口。
  • TM事务管理器,负责分配事务唯一标识,监控事务执行进度,并负责事务的提交或回滚。

TM一般是内嵌到应用程序当中,比如AP持有订单库和商品库2个数据源,应用程序通过TM通知订单库和商品库来创建订单和扣减库存,具体的2个RM此时是未提交事务,把数据锁住了,还没有提交,所以此时的商品和订单资源是锁定状态。

实际上RM代理了之前的数据库提交操作,RM告诉TM我准备好了。

2个RM都发送给TM说我准备好了,TM收到了所有的RM的通知,TM才发送下一个指令,通知所有RM进行真正的提交,然后释放资源,即2个RM分别把锁释放掉。

其实这个模式就是2PC,AT模式有一个记录日志的undolog,记录着之前的数据,XA模式没有undolog。

XA模式的核心

如果一个参与全局事务的RM资源失联了,收不到分支事务的结束命令,那它锁定的数据就会被一直锁定,就有可能会产生死锁,这是XA协议要解决的核心问题,也是Seata引入XA模式要解决的问题。

XA规范的本质就是2PC,利用数据库本身的CRUD来进行代理。

Seata事务模式的原型

DTP模式包含AP、RM、TM。

Seata XA模式包含TC事务协调者,TM事务管理器,RM资源管理器,TC是Seata自己定义的。

Seata定义了全局的事务框架,全局事务可以定义为若干个分支事务的整体协调。

TM开启全局事务,负责全局的提交或回滚请求给TC,TM会创建全局事务的xid。

TM如何把分支的事务定义在一个全局事务中的?

给整个全局事务中具体的分支事务规定一个统一的id,比如当前这个RM事务参与者的xid为1,另外一个RM的xid也为1,就代表这2个RM在一个全局事务上。

TM创建一个xid规定哪些分支事务属于当前这个全局事务。

TM向TC发起提交或回滚全局事务的请求,把全局事务id绑定在分支事务上,代表在一个全局事务中。

具体的RM需要向TC进行注册,告诉TC我当前的执行情况,成功了还是失败了,再由TC告诉RM是提交还是回滚,这是整个的Seata XA事务模式。

Seata XA事务模式也是2PC模式,

  • 执行阶段:执行分支事务并保证执行结果且满足可回滚和可持久化
  • 完成阶段:TM根据执行阶段的结果形成决议,应用通过TM发起全局提交或回滚请求给TC,TC命令RM驱动分支事务进行提交或回滚。

回顾AT事务模式

AT模式是2PC的变种,TM进行全局事务提交和回滚,TM给具体的分支事务加xid,告诉当前分支事务属于这一个全局事务,这部分AT和XA都是一样的。

AT模式解析sql语句,所以在第一阶段(执行阶段),解析当前sql的结果并且记录undolog日志。

首先RM分支事务进行注册到TC中,告诉TC当前分支事务的执行结果是yes还是no。

最终由TC告诉分支事务,谁失败就需要回滚,回滚的时候用到了undolog,根据undolog记录的修改之前的数据来进行反向的补偿更新,这是第二阶段。如果都是yes,就进行整体的提交。TM负责全局的事务开启和提交、回滚操作,TC告诉具体的分支事务是提交还是回滚。

1、执行阶段

  • 可回滚:根据sql解析结果,记录回滚日志undolog
  • 持久化:把日志记录到数据库中

2、完成阶段

  • 提交的时候异步删除回滚日志
  • 回滚的时候,根据回滚日志反向补偿

Seata XA模式

Seata XA模式就是把XA协议归纳到Seata中,在Seata定义的分布式事务架构内,利用数据库、消息服务等对XA的支持,以XA协议的机制来管理分布式事务的一种机制。

Seata XA、AT、 SAGA、TCC都是遵循整个Seata事务模式来进行的。

XA模式开启,执行sql,XA模式结束,这是XA的准备阶段,第二阶段是XA进行提交或回滚。

在Seata的XA模式与AT的区别是XA没有undolog。

AT记录了undolog,根据undolog反向补偿,达到最终一致性。

XA是强一致性,通过数据库的ACID执行的,没有中间状态。

最终一致性存在中间状态,XA不存在中间状态,XA是强一致性的。

第一阶段是执行阶段,保证可回滚和持久化,XA模式对sql进行解析后告诉TC每个分支事务当前执行的情况,TC来决定是提交还是回滚。

把AT替换成了XA,整个的Seata的分布式事务框架不变,只不过AT变成了强一致性的XA。

可回滚是指在XA分支中进行业务sql的执行,由数据库资源对XA协议支持来保证可回滚,即依赖数据源自带的事务的ACID来进行回滚。

持久化是指XA分支在执行完成以后,即XA start和end完成之后,由数据库资源进行持久化,可以保证任何意外都不会造成无法回滚的情况,这样就解决了XA协议的核心痛点。

mysql和oracle都支持XA协议,都支持本地事务,可以保证在任何情况下数据的持久性。

XA的价值

Seata已经支持了3大事务模式AT、SAGA、TCC,为什么还要支持XA?

这3个都是补偿型的,存在中间状态。

构建在事务资源之上的模型,要么在中间件层面实现,要么在应用层面实现,事务资源本身对分布式事务是无感知的。

所谓的事务资源是本地事务,本地事务对分支事务是无法感知的,无法做到真正的全局一致性,即存在中间状态。

比如一个库存当前是100,扣50,还剩50,仓库管理员连接数据库查看当前结果,读到的是50,由于当前这个事务出现了问题,回滚了,50回滚到100了。

仓库管理员读到的是50,就产生了脏读,所谓的脏数据是中间状态,管理员再次连接数据库可以拿到回滚之后的数据。数据50是中间的状态,100是最终一致性的状态。

AT模式:订单下单之后,100个库存扣减1还剩99,订单创建失败了,需要整个全局回滚,undolog中会记录之前的值100 ,但是在事务执行的过程中,会存在99的状态。如果库存减1了,订单并没有真正创建,这个时候读库存,读到的确实是99,这个99就是所谓的中间状态,这个就是脏读。

AT、SAGA、TCC都是补偿型的,都会出现脏读的情况,当然Seata本身是有预防的,但确实会存在这些问题:可能会得到脏数据且最终一致性是允许有中间状态的,这也解释了为什么Seata支持XA,因为XA是强一致性的。

XA没有undolog日志,也不会暴露中间状态。

与补偿型不同,事务资源本身提供对XA规范和协议的支持,事务资源感知并参与分布式事务处理的过程。

数据资源(数据库) 可以保证从任意视角对数据库访问可以有效的隔离且满足全局事务的一致性。

补偿型的事务模型会出现中间状态,当想做到强一致性的时候就需要XA。

XA由数据库本身保证,不会出现仓库管理员查询看到中间状态的情况,这是由本地事务隔离性保证的。

除了强一致性这个优点,还有无业务侵入、数据库支持广泛、多语言的支持、不涉及到sql解析、XA模式对Seata的RM要求比较少、传统的XA模式应用可以平滑迁移到Seata平台的优点。

一致性、可靠性、易用性、性能等系统设计约束需要不同的事务处理机制去完成,Seata提供了全面解决分布式事务问题的标准化平台。

无业务侵入的有AT和XA,有业务侵入的有TCC、 SAGA,XA模式的加入补全了Seata在全局一致性下的缺口。

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

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

相关文章

WPF教程(七)--依赖属性(3)--附加属性

一、 只读依赖属性 以前在对于非WPF的功能来说,对于类的属性的封装中,经常会对那些希望暴露给外界只读操作的字段封装成只读属性,同样在WPF中也提供了只读属性的概念,如一些 WPF控件的依赖属性是只读的,它们经常用于报…

jsp+springboot基于ssm的人才招聘求职网站推荐模拟考试系统java idea

登录需要随机数字验证码 管理员: 招聘管理 求职信息管理 , 招聘信息管理 人员管理 管理注册的用户进行审核操作 公告管理 发布公告新闻 (公告我想不到啥意思,可修改或增加别的) 个人信息 修改个人信息 招聘者&am…

【沐风老师】3dMax填充地形网格插件使用方法详解

3dMax填充地形网格插件使用方法 3dMax填充地形网格插件,它从等高线或现有网格创建和优化地形曲面。基于四边形的输出允许更容易的后期重构,例如使用推/拉绘制。常规的面大小可以减少渲染问题(GI、置换),并且可以在其上…

如何实现Windows RDP 远程桌面异地跨网连接

Windows RDP远程桌面的应用非常广泛。远程桌面协议(RDP)是一个多通道(multi-channel)的协议,让使用者(所在计算机称为用户端或本地计算机)连上提供微软终端机服务的计算机(称为服务端或远程计算机)。大部分的Windows版本都有用户端所需软件,有些其他操作…

【LeetCode】剑指 Offer 65. 不用加减乘除做加法 p310 -- Java Version

题目链接:https://leetcode.cn/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/ 1. 题目介绍(65. 不用加减乘除做加法) 写一个函数,求两个整数之和,要求在函数体内不得使用 “”、“-”、“*”、“/” 四则运算…

C语言入门篇——输入输出篇

目录 1、printf()函数 1.1、printf()函数中的标记 1.2、输出最小宽度(width) 1.3、精度(.precision) 2、scanf()函数 2.1、scanf(“输入控制符”, 输入参数) 2.2、scanf(“输入控制符非输入控制符”, 输入参数); 2.3、字符…

docker简单教程(二)启动服务,实现简单的网站

docker简单教程(二)启动服务 文章目录 docker简单教程(二)启动服务1:创建index.html2:创建Dockerfile3:构建4:启动5:访问6:下一篇将介绍一些常用的操作 这篇我…

Ae 脚本:TypeMonkey 动态文本动画

使用 TypeMonkey 脚本可以快速生成带有摄像机动画的动态文本 Kinetic text效果,简单快捷,无需繁琐的关键帧控制。 经典网络案例:倒鸭子 ◆ ◆ ◆ 使用方法 一般操作流程 新建合成,并确定好合成的持续时间。或者,设置…

句子改写神器-文案自动改写的免费软件

AI改写软件:让你的写作更加轻松高效 现代社会中,写作已经成为了我们各行各业必不可少的一部分。无论是文章、报道、论文还是其他各类文本,都需要花费大量的时间和精力来撰写。而且,在写作过程当中,我们还需要进行反复…

【Java】『蓝桥杯』10道编程题及答案(二)

系列文章 【Java】『蓝桥杯』10道编程题及答案(一) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/130223115 【Java】『蓝桥杯』10道编程题及答案(二) 本文链接:https://blog.csdn.net/y…

Python 代码打造小 AI ,罗列博文笔记总索引列表,自动生成“我的博文笔记总索引”博文 HTML5 源码文本

Python 代码打造小 AI ,获取笔记信息,自动阅读量降序编排索引列表,生成 HTML5 源码文本。 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》&…

依赖自动装配

自动配置 前面花了大量的时间把Spring的注入去学习了下,总结起来就一个字麻烦。 问:麻烦在哪? 答:配置文件的编写配置上。 问:有更简单方式么? 答:有,自动配置 什么是自动配置以及如何实现自动配置,就是接下来要学习的内容&#xf…

English Learning - L2-16 英音地道语音语调 语调 2023.04.20 周四

English Learning - L2-16 英音地道语音语调 语调 2023.04.20 周四 语调降调升调降升升降 语调如何正确的表情达意用降调的句型用升调的句型用降升调的句型升降调 & 平调 回顾词重音句重音弱读语音语调四步法 存档音频 语调 降调 重音音节降 升调 一般表示不确定&#xf…

进制转换—包含整数和小数部分转换(二进制、八进制、十进制、十六进制)手写版,超详细

目录 1.进制转换必备知识: 1.1 二进制逢2进1 8进制逢8进1 10进制逢10进1 16进制逢16进1 1.2为了区分二、八、十、十六进制,我们通常在数字后面加字母进行区分 2. 二进制与八进制、十六进制相互转换 2.1 二进制转八进制 2.2 八…

移动电视双天线分集接收技术解决方案

移动电视双天线分集接收技术 随着DVB-T在手机电视、车载电视、楼宇电视、地铁电视等户外广播领域内的发展,在这些接收范围内,多径衰落、多普勒频移等小范围衰落是不可避免的问题,解决这些衰落和干扰成为倍受关注的问题。为了解决衰落&#x…

ROS学习第二十三节——TF坐标变换实操

1.综述 需求描述: 程序启动之初: 产生两只乌龟,中间的乌龟(A) 和 左下乌龟(B), B 会自动运行至A的位置,并且键盘控制时,只是控制 A 的运动,但是 B 可以跟随 A 运行 结果演示: 实现分析: 乌龟跟随实现的核心,是乌龟…

在外Windows远程连接MongoDB数据库【无公网IP】

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 转载自远程内网穿透的文章:公网远…

【Pytorch学习笔记】12.修改预训练模型权重参数的方法(用于对单通道灰度图使用预训练模型)

文章目录 1.导出模型参数,修改参数2.修改模型结构,导回参数 我们在训练单通道图像,即灰度图(如医学影像数据)时,常会使用预训练模型进行训练。 但是一般的预训练模型是以ImageNet数据集预训练的&#xff0c…

OpenAI Embedding:快速实现聊天机器人(四)

theme: orange 本文正在参加「金石计划」 接上文OpenAI Embedding:快速实现聊天机器人(三)如何使用Python实现embedding相似度搜索,这篇文章继续讲如何将搜索到的相似文本进行提炼,并最终得出问题的答案。 提炼文本 通过调用azure openai服务…

数据库基础篇 《10.创建和管理表》

1. 基础知识 1.1 一条数据存储的过程 1.2 标识符命名规则 1.3 MySQL中的数据类型 其中,常用的几类类型介绍如下: 2. 创建和管理数据库 2.1 创建数据库 方式1:创建数据库 CREATE DATABASE 数据库名; 方式2:创建数据库并指…