分布式事务Seata中XA和AT模式介绍

Seata中XA和AT模式介绍

  • 分布式事务介绍
  • 分布式解决方案
  • 解决分布式事务的思路
  • Seata的架构
    • Seata中的XA模式
      • Seata的XA模型流程
      • XA模式优缺点
      • 实现XA模式
    • Seata中的AT模式
      • Seata中的AT模式流程
      • 实现AT模式
      • AT模式优缺点
  • AT模式与XA模式的区别

分布式事务介绍

分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,例如:

  • 跨数据源的分布式事务
  • 跨服务的分布式事务
    在这里插入图片描述

订单的创建、库存的扣减、账户扣款在每一个服务和数据库内是一个本地事务,可以保证ACID原则。
但是当我们把三件事情看做一个"业务",要满足保证“业务”的原子性,要么所有操作全部成功,要么全部失败,不允许出现部分成功部分失败的现象,这就是分布式系统下的事务了。

分布式解决方案

  1. 解决分布式事务的方案有很多,但实现起来都比较复杂,因此我们一般会使用开源的框架来解决分布式事务问题。在众多的开源分布式事务框架中,功能最完善、使用最多的就是阿里巴巴在2019年开源的Seata了。

在这里插入图片描述

其实分布式事务产生的一个重要原因,就是参与事务的多个分支事务互相无感知,不知道彼此的执行状态。因此解决分布式事务的思想非常简单:

就是找一个统一的事务协调者TC,与多个分支事务通信,检测每个分支事务的执行状态,保证全局事务下的每一个分支事务同时成功或失败即可。大多数的分布式事务框架都是基于这个理论来实现的。

解决分布式事务的思路

分布式事务最大的问题是各个子事务的一致性问题,因此可以借鉴CAP定理和BASE理论,有两种解决思路:

  1. AP模式:各子事务分别执行和提交,允许出现结果不一致,然后采用弥补措施恢复数据即可,实现最终一致。
  2. CP模式:各个子事务执行后互相等待,同时提交,同时回滚,达成强一致。但事务等待过程中,处于弱可用状态。

但不管是哪一种模式,都需要在子系统事务之间互相通讯,协调事务状态,也就是需要一个事务协调者(TC):
在这里插入图片描述
这里的子系统事务,称为分支事务;有关联的各个分支事务在一起称为全局事务。

Seata的架构

Seata事务管理中有三个重要的角色:

  • TC (Transaction Coordinator) - **事务协调者:**维护全局和分支事务的状态,协调全局事务提交或回滚。
  • TM (Transaction Manager) - **事务管理器:**定义全局事务的范围、开始全局事务、提交或回滚全局事务。
  • RM (Resource Manager) - **资源管理器:**管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
    在这里插入图片描述
    其中,TM和RM可以理解为Seata的客户端部分,引入到参与事务的微服务依赖中即可。将来TM和RM就会协助微服务,实现本地分支事务与TC之间交互,实现事务的提交或回滚。

而TC服务则是事务协调中心,是一个独立的微服务,需要单独部署。

Seata中的XA模式

两阶段提交
XA是规范,目前主流数据库都实现了这种规范,实现的原理都是基于两阶段提交。
正常情况:
在这里插入图片描述

异常情况:在这里插入图片描述

  1. 一阶段:
  • 事务协调者通知每个事物参与者执行本地事务
  • 本地事务执行完成后报告事务执行状态给事务协调者,此时事务不提交,继续持有数据库锁
  1. 二阶段:
  • 事务协调者基于一阶段的报告来判断下一步操作
  • 如果一阶段都成功,则通知所有事务参与者,提交事务
  • 如果一阶段任意一个参与者失败,则通知所有事务参与者回滚事务

Seata的XA模型流程

Seata对原始的XA模式做了简单的封装和改造,以适应自己的事务模型,基本架构如图:
在这里插入图片描述
1. RM一阶段的工作:

  • 册分支事务到TC
  • 执行分支业务sql但不提交
  • ​报告执行状态到TC

2. TC二阶段的工作

TC检测各分支事务执行状态

  • 如果都成功,通知所有RM提交事务
  • 如果有失败,通知所有RM回滚事务

3. RM二阶段的工作:

  • 接收TC指令,提交或回滚事务

XA模式优缺点

XA模式的优点是什么?

  1. 事务的强一致性,满足ACID原则。
  2. 常用数据库都支持,实现简单,并且没有代码侵入

XA模式的缺点是什么?

  1. 因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差
  2. 依赖关系型数据库实现事务

实现XA模式

Seata的starter已经完成了XA模式的自动装配,实现非常简单,步骤如下:

1)修改application.yml文件(每个参与事务的微服务),开启XA模式:

seata:
  data-source-proxy-mode: XA

2)给发起全局事务的入口方法添加@GlobalTransactional注解:

3)重启服务并测试

重启服务,再次测试,发现无论怎样,三个微服务都能成功回滚。

Seata中的AT模式

AT模式同样是分阶段提交的事务模型,不过缺弥补了XA模型中资源锁定周期过长的缺陷。

Seata的AT模型基本流程图:
在这里插入图片描述

  1. 阶段一RM的工作:
  • 注册分支事务
  • 记录undo-log(数据快照)
  • 执行业务sql并提交
  • 报告事务状态
  1. 阶段二提交时RM的工作:
  • 删除undo-log即可
  1. 阶段二回滚时RM的工作:
  • 根据undo-log恢复数据到更新前

Seata中的AT模式流程

AT模式下,当前分支事务执行流程如下:
1. 一阶段:

  • TM发起并注册全局事务到TC
  • TM调用分支事务
  • 分支事务准备执行业务SQL
  • RM拦截业务SQL,根据where条件查询原始数据,形成快照。
  • RM执行业务SQL,提交本地事务,释放数据库锁。
  • RM报告本地事务状态给TC

2. 二阶段:

  • TM通知TC事务结束
  • TC检查分支事务状态
    ​ a)如果都成功,则立即删除快照
    ​ b)如果有分支事务失败,需要回滚。

流程图:
在这里插入图片描述

实现AT模式

  1. 在分布式微服务中的数据库创建undo_log表
CREATE TABLE `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 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 DEFAULT CHARSET=utf8mb3 COMMENT='AT transaction mode undo table';
  1. 然后修改application.yml文件(每个参与事务的微服务),开启AT模式:
seata:
  data-source-proxy-mode: AT

AT模式优缺点

  1. AT模式的优点:
  • 一阶段完成直接提交事务,释放数据库资源,性能比较好
  • 利用全局锁实现读写隔离
  • 没有代码侵入,框架自动完成回滚和提交
  1. AT模式的缺点:
  • 两阶段之间属于软状态,属于最终一致
  • 框架的快照功能会影响性能,但比XA模式要好很多

AT模式与XA模式的区别

简述AT模式与XA模式最大的区别是什么?

  1. XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。
  2. XA模式依赖数据库机制实现回滚;AT模式利用数据快照实现数据回滚。
  3. XA模式强一致;AT模式最终一致

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HCIA-RS基础-VLAN配置

目录 前言创建拓扑创建VLAN查看创建的VLAN配置trunk口并放行VLAN配置access接口查看所有vlan基本信息测试网络连通性命令合集 前言 VLAN定义:VLAN是一种将局域网内的设备从逻辑上划分成一个个网段,从而实现虚拟工作组的新兴数据交换技术。VLAN优点&…

移动硬盘读不出来?5个解决技巧公开!

“不知道为什么,我的移动硬盘突然就读不出来了,大家有什么方法可以更好的读取移动硬盘吗?希望大家帮帮我!” 在数字化日益盛行的今天,移动硬盘已成为我们存储和携带大量数据的重要工具。然而,当这个“数据仓…

HashMap第2讲——put方法源码及细节

上篇文章介绍了HashMap在JDK 1.8前后的四大变化,今天就进入到put方法的源码解析。HashMap的设计非常巧妙,细节也很多,今天来看看部分细节,后续的文章会一一介绍。 ps:学习源码的目的不仅仅是为了了解它的运行机制&…

idea的代码没有提交到仓库怎么撤回到本地?

代码已经提交到变更列表但是还没有push推送到仓库上,可以用这个方法 点击日志-右键要撤回的记录-选择撤销提交 撤销的又回到本地变更 当然你只能撤销自己提交的,别人的你撤销不了

AI基础设施是AI落地赋能的核心关键

AI基础设施内涵与特性 以深度落地赋能为导向,AI供给侧持续推进技术要素全面融合、技术能力自主可控、技术服务普惠低成本,AI供给“基建 化”势在必行,AI基础设施正成为AI的关键供给形态。算法、算力、数据是AI技术应用的三大核心支撑要素&am…

SpringBoot+Vue在线视频课程网站(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 用户教师管理员 系统功能截图

Gradio.NET:一个快速制作演示demo网页的利器

Gradio介绍 Gradio是一个用于创建机器学习模型交互界面的Python库。它允许开发者快速为他们的模型创建一个简单的web界面,以便于非技术用户和其他开发者进行交互和测试。 Gradio的主要优点是易用性和灵活性。你只需要几行代码就可以为你的模型创建一个交互界面。你…

【Python数据挖掘实战案例】机器学习LightGBM算法原理、特点、应用---基于鸢尾花iris数据集分类实战

一、引言 1、简要介绍数据挖掘的重要性和应用 在数字化时代,数据已经成为企业和社会决策的重要依据。数据挖掘作为一门交叉学科,结合了统计学、机器学习、数据库技术和可视化等多个领域的知识,旨在从海量数据中提取有价值的信息&#xff0c…

Marvelous Designer中一些棉质布料预设

Marvelous Designer中一些棉质布料预设的解释: Cotton_14_Wale_Corduroy:14条细鲸鱼纹的灯芯绒,适合制作温暖且有质感的服装。Cotton_40s_Chambray:40支精梳针织的府绸布,通常用于制作休闲衬衫。Cotton_40s_Poplin&am…

echars饼图、柱状图 java返回的数据格式

1、echars饼状图返回的数据格式 [ { "name": "A", "value": 3 }, { "name": "B", "value": 2 }, { "name": "C", "value": 2 } ] java代码Demo 为例:根据名字分组&…

vuInhub靶场实战系列--prime:1

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 nmap主机扫描2.1.3 arp-scan主机扫描 2.2 端口扫描…

【CMake系列】06-项目结构与输出路径管理

为了对大型项目实现更好的管理【模块化协作开发等等】,cmake 提供了很多指令,可以对项目的结构进行调整、管理,便于项目的合理规划。本文我们要学习的就是 项目结构的设置,以及 构建程序等 输出路径的设置 本专栏的实践代码全部放…

倾斜侧壁增强光提取效率相关机制的建模仿真研究

较低的光提取效率(LEE)是制约深紫外发光二极管(LED)快速发展的一个重要因素,倾斜侧壁结构可以直接将横向传播的横向磁场(TM)偏振光散射到c面逃逸锥,从而提高器件的LEE,因…

review of c++

友元关系是单向的。 指针

什么是数字化转型?

作者: 峡山老曹 数字神化 ”企业如何实现数字化转型“是摆在现代企业面前一个无法回避的问题,数字化转型的重要性不容忽视,它不仅是企业适应数字化时代的必然要求,更是提升竞争力、实现可持续发展的关键。随着科技的飞速发展和市场…

MFTCoder论文被KDD 2024接收,开源v0.4.2版发布

1. MFTCoder 简介 CodeFuse在2023年9月开源了一种多任务微调框架——MFTCoder,它可以实现在多个任务上同时并行地进行微调。通过结合多种损失函数,我们有效地解决了多任务学习中常见的任务间数据量不平衡、难易不一和收敛速度不一致等挑战。大量实验结果…

【C语言】文件操作(下卷)

前言 在上一卷中,我们知道了文件指针、文件的打开和关闭(打开其他位置的文件)、文件的顺序读写(其中的fputc()、fgetc()),这一卷中,将继续讲解文件操作未讲到的地方。 内容有点多,…

Vue3【三】 使用TS自己编写APP组件

Vue3【三】 使用TS自己编写APP组件 运行截图 目录结构 注意目录层级 文件源码 APP.vue <template><div class"app"><h1>你好世界!</h1></div> </template><script lang"ts"> export default {name:App //组…

redsystems教程的基本使用之重置密码(忘记密码解决方法)

前言&#xff1a; 相信很多人都有疑惑&#xff0c;要是我不记得密码怎么办&#xff1f;如果你登录了&#xff0c;点击更改密码后&#xff0c;还是要你填写登录密码才能修改。为了解决这问题&#xff0c;博主通过了钻研成功搞出来了&#xff01;&#xff01;&#xff01;&#…

重学java 64.IO流 字符流

Action speak louder than words —— 24.6.5 字符输入流 一、字节流读取中文的问题 1.注意&#xff1a; 字节流是万能流&#xff0c;这个万能更侧重于文件复制&#xff0c;但是尽量不要边读边看 2.原因&#xff1a; UTF-8&#xff1a;一个汉字占三个字节 GBK&#xff1a;一…