【Seata】Seata——分布式事务框架(理论篇)

目录

  • 解释
  • Seata的三大角色
  • Seata的分布式事务解决方案:
    • AT 模式
      • 整体机制
        • 一阶段
        • 二阶段
      • 完整图例
    • XA模式
      • DTP模型
      • Seata的XA模式
      • Seata-XA的价值
      • 小结
      • XA协议的问题
    • TCC模式
      • 解释
      • Seata的TCC模式
      • Seata-TCC特点
    • Saga模式
      • Saga的价值
      • Saga状态机
        • 基本原理
        • Saga状态机设计器
    • 四种模式的对比
  • Seata的优点

解释

  • Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。
  • Seata 将为用户提供了 AT、TCC、SAGA 和XA 事务模式,为用户打造一站式的分布式解决方案。
  • AT模式是阿里首推的模式,阿里云上有商用版本的GTS(Global Transaction Service 全局事务服务)。

Seata的三大角色

  • TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚。
  • TM (Transaction Manager) - 事务管理器:定义全局事务的范围:开始全局事务、提交或回滚全局事务。
  • RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

TC 为单独部署的 Server 服务端,TM 和 RM 为嵌入到应用中的 Client 客户端。
在这里插入图片描述

Seata的分布式事务解决方案:

  • XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入。
  • TCC模式:最终一致的分阶段事务模式,有业务侵入。
  • AT模式:最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式。
  • SAGA模式:长事务模式,有业务侵入。

AT 模式

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

整体机制

在这里插入图片描述

两阶段提交协议的演变:

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

在一阶段中,Seata会拦截“业务SQL”,首先解析SQL的语义,找到要更新的业务数据,在数据更新前,保存下来“undo”,然后执行“业务SQL”更新数据,更新之后再次保存数据“redo”,最后生成行锁,这些操作都在本地数据库事务内完成,这样保证了一阶段的原子性。

  • 拦截" 业务SQL",解析 SQL 语义
  • 查询 “业务SQL” 要更新的业务数据,在业务数据被更新前,将其保存成 “before image”
  • 执行 “业务SQL” ,更新业务数据
  • 查询更新后的数据,将其保存成 “after image”
  • 将 before image 和 after image 保存至 Undo Log 表中
  • 生成行锁

以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性。
在这里插入图片描述

二阶段

相对一阶段,二阶段比较简单,负责整体的回滚和提交,如果之前的一阶段中有本地事务没有通过,那么就执行全局回滚,否则执行全局提交,回滚用到的就是一阶段记录的“undo Log”,通过回滚记录生成反向更新SQL并执行,以完成分支的回滚。当然事务完成后会释放所有资源和删除所有的日志。

  • 提交:因为 “业务SQL” 在一阶段已经提交至数据库,所以 Seata 框架只需将一阶段保存的快照数据和行锁删掉,完成数据清理即可
    在这里插入图片描述
  • 回滚
    • 首先要校验脏写,对比“数据库当前业务数据”和 “after image”
      • 如果两份数据完全一致就说明没有脏写,可以还原业务数据。
      • 如果不一致就说明有脏写,出现脏写就需要转人工处理。
    • 用“before image”还原业务数据
    • 删除快照数据和行锁
      在这里插入图片描述

完整图例

在这里插入图片描述
以订单业务为例:下单操作中包含 对订单服务与库存服务的操作,分别修改订单状态,与库存数量
在这里插入图片描述

XA模式

  • 不存在某一种分布式事务机制可以完美适应所有场景,满足所有需求。
  • 现在,无论 AT 模式、TCC 模式还是 Saga 模式,这些模式的提出,本质上都源自 XA 规范对某些场景需求的无法满足
  • XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准
  • XA 规范 描述了全局的事务管理器与局部的资源管理器之间的接口。 XA规范 的目的是允许的多个资源(如数据库,应用服务器,消息队列等)在同一事务中访问,这样可以使 ACID 属性跨越应用程序而保持有效。
  • XA 规范 使用两阶段提交(2PC,Two-Phase Commit)来保证所有资源同时提交或回滚任何特定的事务。
  • XA 规范 在上世纪 90 年代初就被提出。目前,几乎所有主流的数据库都对 XA 规范 提供了支持。

DTP模型

DTP模型角色介绍

  • AP:即应用程序,可以理解为使用DTP分布式事务的程序
  • RM:资源管理器,可以理解为事务的参与者,一般情况下是指一个数据库的实例(MySql),通过资源管理器对该数据库进行控制,资源管理器控制着分支事务
  • TM:事务管理器,负责协调和管理事务,事务管理器控制着全局事务,管理实务生命周期,并协调各个RM。全局事务是指分布式事务处理环境中,需要操作多个数据库共同完成一个工作,这个工作即是一个全局事务。

DTP模式定义TM和RM之间通讯的接口规范叫XA,简单理解为数据库提供的2PC接口协议,基于数据库的XA协议来实现的2PC又称为XA方案。
在这里插入图片描述

  1. 应用程序(AP)持有订单库和商品库两个数据源。
  2. 应用程序(AP)通过TM通知订单库(RM)和商品库(RM),来创建订单和减库存,RM此时未提交事务,此时商品和订单资源锁定。
  3. TM收到执行回复,只要有一方失败则分别向其他RM发送回滚事务,回滚完毕,资源锁释放。
  4. TM收到执行回复,全部成功,此时向所有的RM发起提交事务,提交完毕,资源锁释放。
    在这里插入图片描述

Seata的XA模式

在 Seata 定义的分布式事务框架内,利用事务资源(数据库、消息服务等)对 XA 协议的支持,以 XA 协议的机制来管理分支事务的一种事务模式。
在这里插入图片描述

  • 执行阶段:
    • 可回滚:业务 SQL 操作放在 XA 分支中进行,由资源对 XA 协议的支持来保证 可回滚
    • 持久化:XA 分支完成后,执行 XA prepare,同样,由资源对 XA 协议的支持来保证 持久化(即,之后任何意外都不会造成无法回滚的情况)
  • 完成阶段:
    • 分支提交:执行 XA 分支的 commit
    • 分支回滚:执行 XA 分支的 rollback

Seata-XA的价值

  • 本质上,Seata 已经支持的 3 大事务模式:AT、TCC、Saga 都是补偿型 的。
  • 补偿型事务处理机制构建在事务资源之上(要么在中间件层面,要么在应用层面),事务资源 本身对分布式事务是无感知的。
  • 事务资源对分布式事务的无感知存在一个根本性的问题:无法做到真正的全局一致性 。

比如,一条库存记录,处在 补偿型 事务处理过程中,由 100 扣减为 50。此时,仓库管理员连接数据库,查询统计库存,就看到当前的 50。之后,事务因为异外回滚,库存会被补偿回滚为 100。显然,仓库管理员查询统计到的 50 就是 脏 数据。所以补偿型事务是存在中间状态的(中途可能读到脏数据)。

  • 与 补偿型 不同,XA 协议 要求 事务资源 本身提供对规范和协议的支持。

  • 因为 事务资源 感知并参与分布式事务处理过程,所以 事务资源(如数据库)可以保障从任意视角对数据的访问有效隔离,满足全局数据一致性。

比如,刚才提到的库存更新场景,XA 事务处理过程中,中间状态数据库存 50 由数据库本身保证,是不会仓库管理员的查询统计看到的。

  • 除了 全局一致性 这个根本性的价值外,支持 XA 还有如下几个方面的好处:
    • 业务无侵入:和 AT 一样,XA 模式将是业务无侵入的,不给应用设计和开发带来额外负担。
    • 数据库的支持广泛:XA 协议被主流关系型数据库广泛支持,不需要额外的适配即可使用。
    • 多语言支持容易:因为不涉及 SQL 解析,XA 模式对 Seata 的 RM 的要求比较少。
    • 传统基于 XA 应用的迁移:传统的,基于 XA 协议的应用,迁移到 Seata 平台,使用 XA 模式将更平滑。

小结

  • 在当前的技术发展阶段,不存一个分布式事务处理机制可以完美满足所有场景的需求。
  • 一致性、可靠性、易用性、性能等诸多方面的系统设计约束,需要用不同的事务处理机制去满足。
  • Seata项目最核心的价值在于:构建一个全面解决分布式事务问题的 标准化 平台。
  • 基于Seata,上层应用架构可以根据实际场景的需求,灵活选择合适的分布式事务解决方案。
    在这里插入图片描述
  • XA 模式的加入,补齐了 Seata 在 全局一致性 场景下的缺口,形成 AT、TCC、Saga、XA 四大事务模式 的版图,基本可以满足所有场景的分布式事务处理诉求。

XA协议的问题

  • 如果一个参与全局事务的资源 “失联” 了(收不到分支事务结束的命令),那么它锁定的数据,将一直被锁定。进而,甚至可能因此产生死锁。
  • 这是 XA 协议的核心痛点,也是 Seata 引入 XA 模式要重点解决的问题。

TCC模式

解释

  • TCC 是分布式事务中的二阶段提交协议,它的全称为 Try-Confirm-Cancel,即资源预留(Try)、确认操作(Confirm)、取消操作(Cancel),他们的具体含义如下:

    • Try:对业务资源的检查并预留。
    • Confirm:对业务处理进行提交,即 commit 操作,只要 Try 成功,那么该步骤一定成功。
    • Cancel:对业务处理进行取消,即回滚操作,该步骤回对 Try 预留的资源进行释放。
  • TCC 是一种侵入式的分布式事务解决方案,以上三个操作都需要业务系统自行实现,对业务系统有着非常大的入侵性,设计相对复杂

  • 但优点是 TCC 完全不依赖数据库,能够实现跨数据库、跨应用资源管理,对这些不同数据访问通过侵入式的编码方式实现一个原子操作,更好地解决了在各种复杂业务场景下的分布式事务问题。

在这里插入图片描述

Seata的TCC模式

Seata TCC 模式跟通用型 TCC 模式原理一致。与AT区别如下

  • AT 模式基于 支持本地 ACID 事务 的 关系型数据库:

    • 一阶段 prepare 行为:在本地事务中,一并提交业务数据更新和相应回滚日志记录。
    • 二阶段 commit 行为:马上成功结束,自动 异步批量清理回滚日志。
    • 二阶段 rollback 行为:通过回滚日志,自动 生成补偿操作,完成数据回滚。
  • TCC 模式不依赖于底层数据资源的事务支持:

    • 一阶段 prepare 行为:调用 自定义 的 prepare 逻辑。
    • 二阶段 commit 行为:调用 自定义 的 commit 逻辑。
    • 二阶段 rollback 行为:调用 自定义 的 rollback 逻辑。

所谓 TCC 模式,是指支持把 自定义 的分支事务纳入到全局事务的管理中。
在这里插入图片描述

Seata-TCC特点

  • 侵入性比较强,并且需要自己实现相关事务控制逻辑。
  • 在整个过程基本没有锁,性能较强。

在这里插入图片描述

Saga模式

  • Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务
  • 当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务(执行处理时候出错了,给一个修复的机会)都由业务开发实现。

在这里插入图片描述

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

Saga的价值

  • 在一些特殊环境下,比如老系统,封闭的系统(无法修改,同时没有任何分布式事务引入),那么AT、XA、TCC模型将全部不能使用,为了解决这样的问题,才引用了Saga模型。
  • 比如:事务参与者可能是其他公司的服务或者是遗留系统,无法改造,可以使用Saga模式。

在这里插入图片描述

  • Saga模式是Seata提供的长事务解决方案,提供了异构系统的事务统一处理模型。
  • 在Saga模式中,所有的子业务都不在直接参与整体事务的处理(只负责本地事务的处理),而是全部交由了最终调用端来负责实现
  • 而在进行总业务逻辑处理时,在某一个子业务出现问题时,则自动补偿全面已经成功的其他参与者
  • 这样一阶段的正向服务调用和二阶段的服务补偿处理全部由总业务开发实现。

在这里插入图片描述

Saga状态机

  • 目前Seata提供的Saga模式只能通过状态机引擎来实现,需要开发者手工的进行Saga业务流程绘制,并且将其转换为Json配置文件
  • 而后在程序运行时,将依据子配置文件实现业务处理以及服务补偿处理,而要想进行Saga状态图的绘制,一般需要通过Saga状态机来实现。
基本原理
  • 通过状态图来定义服务调用的流程并生成json定义文件。
  • 状态图中一个节点可以调用一个服务,节点可以配置它的补偿节点。
  • 状态图 json 由状态机引擎驱动执行,当出现异常时状态引擎反向执行已成功节点对应的补偿节点将事务回滚。
  • 可以实现服务编排需求,支持单项选择、并发、子流程、参数转换、参数映射、服务执行状态判断、异常捕获等功能。
Saga状态机设计器
  • Seata Saga 提供了一个可视化的状态机设计器方便用户使用,代码和运行指南:https://github.com/seata/seata/tree/develop/saga/seata-saga-statemachine-designer
  • 演示地址:http://seata.io/saga_designer/index.html
  • 状态机设计器视频教程:http://seata.io/saga_designer/vedio.html

四种模式的对比

 XAATTCCSAGA
一致性强一致弱一致弱一致最终一致
隔离性完全隔离基于全局锁隔离基于资源预留隔离无隔离
代码入侵有,要编写三个接口有,要编写状态机和补偿业务
性能非常好非常好
场景对一致性、隔离性有高要求的业务基于关系型数据库的大多数分布式事务场景都可以对性能要求高的事务
有非关系型数据库要参与的事务
业务流程长、业务流程多
参与者包含其他公司或者遗留系统服务,无法提供TCC模式要求的三个接口
  • AT模式,是我们常用的处理模式,也是使用最多的一种。
  • XA和AT,是无侵入式的,二者间的切换只需要更改数据源的代理对象即可。
  • TCC需要我们手动、自定义,try、Confirm、Cancel。
  • Saga是针对老项目,不可更改的项目,通过外部的形式解决调用的时候出现的分布式问题,通过Saga中的状态机进行总业务逻辑的设计。

Seata的优点

  1. 应用层基于SQL解析实现了自动补偿,从而最大程度的降低业务侵入性;
  2. 将分布式事务中TC(事务协调者)独立部署,负责事务的注册、回滚;
  3. 通过全局锁实现了写隔离与读隔离。

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

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

相关文章

JavaFX 下拉框

组合框允许用户选择几个选项之一。用户可以滚动到下拉列表。组合框可以是可编辑和不可编辑的。 创建组合框 以下代码将选项列表包装到ObservableList中&#xff0c;然后使用observable列表实例化ComboBox类。 ObservableList<String> options FXCollections.observab…

情系端午,爱暖精诚 | 我院开展温情献礼端午慰问活动

端午佳节将至&#xff0c;为感谢全体员工在医院发展中的无私奉献和辛勤努力&#xff0c;传递对大家的深情关怀&#xff0c;提升员工的归属感与凝聚力。6月6日&#xff0c;医院特别为全体员工精心准备了节日福利&#xff0c;为每位员工送上饱含爱意的节日礼品。 一盒盒满载心意的…

【Docker实战】jenkins卡在编译Dockerfile的问题

我们的项目是标准的CI/CD流程&#xff0c;也即是GitlabJenkinsHarborDocker的容器自动化部署。 经历了上上周的docker灾难&#xff0c;上周的服务器磁盘空间灾难&#xff0c;这次又发生了jenkins卡住的灾难。 当然&#xff0c;这些灾难有一定的连锁反应&#xff0c;是先发生的d…

vue3-父子通信

一个简单的vue3子组件调用父组件方法的demo <template> <div> <h2>Parent Component父组件</h2> <ChildComponent notify-parent"handleParentMethod" /> </div> </template> <script> import { ref } fr…

hugging face:大模型时代的github介绍

1. Hugging Face是什么&#xff1a; Hugging Face大模型时代的“github”&#xff0c;很多人有个这样的认知&#xff0c;但是我觉得不完全准确&#xff0c;他们相似的地方在于资源丰富&#xff0c;github有各种各样的软件代码和示例&#xff0c;但是它不是系统的&#xff0c;没…

HTML5基本语法

文章目录 HTML5基本语法一、基础标签1、分级标题2、段标签3、换行及水平线标签4、文本格式标签 二、图片标签1、格式2、属性介绍 三、音频标签1、格式2、属性介绍 四、视频标签1、格式2、属性介绍 五、链接标签1、格式2、显示特点3、属性介绍4、补充&#xff08;空链接&#xf…

计算机毕业设计Python+Flask弹幕情感分析 B站视频数据可视化 B站爬虫 机器学习 深度学习 人工智能 NLP文本分类 数据可视化 大数据毕业设计

首先安装需要的python库&#xff0c; 安装完之后利用navicat导入数据库文件bili100.sql到mysql中&#xff0c; 再在pycharm编译器中连接mysql数据库&#xff0c;并在设置文件中将密码修改成你的数据库密码。最后运行app.py&#xff0c;打开链接&#xff0c;即可运行。 B站爬虫数…

【博士每天一篇文献-算法】Memory aware synapses_ Learning what (not) to forget

阅读时间&#xff1a;2023-12-13 1 介绍 年份&#xff1a;2018 作者&#xff1a;Rahaf Aljundi,丰田汽车欧洲公司研究员;阿卜杜拉国王科技大学(KAUST)助理教授;Marcus Rohrbach德国达姆施塔特工业大学多模式可靠人工智能教授 会议&#xff1a; Proceedings of the European c…

物联网协议应用

目录 前言一、WIFI简介二、NTP协议2.1 NTP简介2.2 NTP实现 三、HTTP协议3.1 HTTP协议简介3.2 HTTP服务器 四、MQTT协议4.1 MQTT协议简介4.1.1 MQTT通信模型4.1.2 MQTT协议实现原理4.1.3 MQTT 控制报文 4.2 移植MQTT协议 前言 本文主要介绍一下物联网协议如NTP协议、HTTP协议和M…

Redis 内存策略

一、Redis 内存回收 Redis 之所以性能强&#xff0c;最主要的原因就是基于内存存储。然而单节点的 Redis 其内存大小不宜过大&#xff0c;会影响持久化或主从同步性能。 我们可以通过修改配置文件来设置 Redis 的最大内存&#xff1a; # 格式&#xff1a; # maxmemory <byt…

高等数学笔记(二):极限

一、数列极限的定义 以下符号表示 “对于任意给定的” 以下符号表示 “存在” 以下符号表示 “如果什么&#xff08;箭头左&#xff09;&#xff0c;则什么&#xff08;箭头右&#xff09;” 二、收敛数列的性质 2.1 唯一性 2.2 有界性 2.3 保号性 2.4 子数列收敛性 三、函数…

无痛接入图像生成风格迁移能力:GAN生成对抗网络

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

网络安全:探索云安全的最佳实践

文章目录 网络安全&#xff1a;探索云安全的最佳实践引言云安全简介云安全面临的挑战云安全的最佳实践数据加密身份和访问管理定期安全审计 结语 网络安全&#xff1a;探索云安全的最佳实践 引言 在我们之前的文章中&#xff0c;我们讨论了网络安全的多个方面&#xff0c;包括…

卫生间毫米波雷达跌倒检测,飞睿智能人体存在感应器,智能识别老人跌倒守护安全

在智能家居飞速发展的今天&#xff0c;雷达技术已经悄然走进了我们的生活&#xff0c;尤其在卫生间这样的特殊场景中&#xff0c;毫米波雷达人体存在感应器和跌倒检测技术的应用&#xff0c;通过及时识别老年人跌倒等意外情况&#xff0c;及时发送警报信息&#xff0c;不仅为我…

数学建模基础:线性模型

目录 前言 一、线性方程组 二、线性规划 三、线性回归 四、线性模型的应用 五、实例示范&#xff1a;医疗成本预测 步骤 1&#xff1a;导入数据 步骤 2&#xff1a;数据预处理 步骤 3&#xff1a;建立多元线性回归模型 步骤 4&#xff1a;模型验证 步骤 5&#xff1…

数据库物理计划执行指南

一、背景介绍 伴随信息技术地迅猛发展和应用范围地逐步扩大&#xff0c;数据库已成为企业存储与管理数据的重要工具。但数据量激增以及用户访问需求的与日剧增&#xff0c;数据库性能也将面临巨大挑战。 好在数据库物理计划执行是解决数据库性能问题的重要手段之一&#xff0…

【机器学习】第11章 神经网络与深度学习(重中之重)

一、概念 1.神经元模型 &#xff08;1&#xff09;神经网络的基本组成单位 &#xff08;2&#xff09;生物上&#xff0c;每个神经元通过树突接受来自其他被激活神经元的信息&#xff0c;通过轴突释放出来的化学递质改变当前神经元内的电位。当神经元内的电位累计到一个水平时…

基础购物车(Javascript)

使用Javascript写一个基础购物车&#xff0c;其中包含商品数量加加减减&#xff0c;下面的总价和总数量跟着商品数量变动&#xff0c;还可以自己添加需要的商品。 基础购物车的结构样式如下&#xff1a; HTML代码&#xff1a; <body><table border"1px" c…

百度智能云推出智能运维工具,云助手让云服务器运维更简单

为了提升云服务器执行命令的效率&#xff0c;百度智能云发布了 SmartTerm 远程连接终端。不止于此&#xff0c;为了更加极致地提升运维效率&#xff0c;我们又推出了「云助手」这款轻量快捷的运维工具。 ​ 只有做过云服务器运维的人才知道管理上万台云服务器有多崩溃。在海量…

全局指令选择

概述 基于SelectionDAG 的指令选择方法可以生成质量较高的机器码&#xff0c;但代价是开发难度和代码复杂度较高 快速指令选择方法复杂度较低&#xff0c;但代码质量较差。为了综合二者的优点&#xff0c;取长补短&#xff0c;LLVM在现有的架构上实现了全局指令选择&#xff…