Spring Cloud Alibaba —— Seata 分布式事务框架

导航

  • 一、Seata 介绍
  • 二、Seata 的工作原理
    • 2.1 三个角色
    • 2.2 工作流程
  • 三、Seata AT 工作机制
    • 3.1 一阶段
    • 3.2 二阶段
  • 四、案例演示(待补充)

一、Seata 介绍

官网:Seata 官网

Seata 是2019 年阿里巴巴中间件团队发起的开源项目,其前身是 Fescar(Fast & EaSy Commit And Rollback)。其愿景是让分布式的使用像本地事务的使用一样简单、高效,并逐步解决开发者遇到的分布式事务方面的所有难题。

Seata 意为 Simple Extensible Autonomous Transaction Architecture,简单可扩展自治分布式框架。

Seata 的设计目标是对业务无侵入,因此从业务无侵入的 2PC 方案入手,在传统 2PC 的基础上扩展,把一个分布式事务理解成一个包含若干分支事务的全局事务
在这里插入图片描述

二、Seata 的工作原理

2.1 三个角色

1、TC:Transaction Coordinator 事务协调器,管理全局的分支事务状态,用于全局性事务的提交和回滚。
2、TM:Transaction Manager 事务管理器,用于开启、提交或回滚全局事务。
3、RM:Resource Manager 资源管理器,用于分支事务上的资源管理,向 TC 注册分支事务,上报分支事务的状态,接收 TC 的命令来提交或回滚分支事务。
在这里插入图片描述

2.2 工作流程

假设上图中的三个服务根据调用关系为 A–> B–>C,那么 Seata 的执行流程如下:

1、A 服务的TM 向TC申请开启一个全局事务,TC会创建一个全局事务并返回一个 唯一的 XID。
2、A 服务的 RM向 TC注册分支事务,并将其纳入 XID 对应全局事务的管辖。
3、A 服务执行分支事务,操作数据库。
4、A 服务开始远程调用 B 服务,此时XID 会在微服务的调用链上传播。
5、B 服务的 RM 向TC 注册分支事务,并将其纳入 XID 对应的全局事务的管辖。
6、B 服务执行分支事务,操作数据库。
7、全局事务调用链处理完毕,TM 根据有无异常向 TC 发起全局事务的提交或回滚。
8、TC 协调其管辖下的所有分支事务,决定是否回滚。

Seata 实现 2PC 与传统 2PC 的区别:

1、架构层次方面,传统 2PC 方案的 RM 实际上是在数据库层,RM 本质就是数据库,通过 XA 协议实现,而 Seata 的 RM 是以 jar 包的形式作为中间件层部署在应用程序这一侧的。
2、两阶段提交方面,传统 2PC 无论第二阶段的决议是 commit 还是 rollback ,事务性资源的锁都要保持到 Phase 2 完成才释放。而 Seata 的做法是在 Phase 1 就将本地事务提交,这样就可以省去 Phase 2 持锁的时间,整体提高效率。

三、Seata AT 工作机制

Seata 在 2PC 提交模型的基础上进行了演进,视为 Seata AT 模式。除此之外,还有 Seata TCC模式、Seata XA 模式等。

Seata AT 模式非常简单,也是两阶段提交。

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

下面以一个简单示例说明整体 AT 模式的工作机制,参考原文:Seata AT 模式

3.1 一阶段

商品表:product :

FieldTypeKey
idbigint(20)PRI
namevarchar(100)
sincevarchar(100)

业务逻辑:

update product set name = 'GTS' where name = 'TXC';

1、解析SQL:得到 Sql 类型(update),表(product),条件等信息。
2、查询前镜像:根据解析得到的条件,生成查询语句,定位数据:

select id, name, since from product where name = 'TXC';
idnamesince
1TXC2014

3、执行业务 SQL:更新这条记录的 name 为 ‘GTS’。
4、查询后镜像:根据前镜像的结果,通过 主键 定位数据。

select id, name, since from product where id = 1;
idnamesince
1GTS2014

5、插入回滚日志:把前后镜像数据以及业务 SQL 相关的信息组成一条回滚日志记录,插入到 UNDO_LOG 表中。

{"branchId": 641789253,"undoItems": [{"afterImage": {"rows": [{"fields": [{"name": "id","type": 4,"value": 1}, {"name": "name","type": 12,"value": "GTS"}, {"name": "since","type": 12,"value": "2014"}]}],"tableName": "product"},"beforeImage": {"rows": [{"fields": [{"name": "id","type": 4,"value": 1}, {"name": "name","type": 12,"value": "TXC"}, {"name": "since","type": 12,"value": "2014"}]}],"tableName": "product"},"sqlType": "UPDATE"}],"xid": "xid:xxx"
}

6、提交前,向 TC 注册分支:申请 product 表中,主键值等于 1 的记录的 全局锁 。
7、本地事务提交:业务数据的更新和前面步骤中生成的 UNDO LOG 一并提交。
8、将本地事务提交的结果上报给 TC。

3.2 二阶段

回滚
1、收到 TC 的分支回滚请求,开启一个本地事务,执行如下操作。
2、通过 XID 和 Branch ID 查找到相应的 UNDO LOG 记录。
3、数据校验:拿 UNDO LOG 中的后镜与当前数据进行比较,如果有不同,说明数据被当前全局事务之外的动作做了修改。这种情况,需要根据配置策略来做处理,详细的说明在另外的文档中介绍。
4、根据 UNDO LOG 中的前镜像和业务 SQL 的相关信息生成并执行回滚的语句:

update product set name = 'TXC' where id = 1;

5、提交本地事务。并把本地事务的执行结果(即分支事务回滚的结果)上报给 TC。

提交
1、收到 TC 的分支提交请求,把请求放入一个异步任务的队列中,马上返回提交成功的结果给 TC。
2、异步任务阶段的分支提交请求将异步和批量地删除相应 UNDO LOG 记录。

四、案例演示(待补充)

演示一个电商下订单扣库存的应用案例,看下 Seata 是如何使用的。

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

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

相关文章

云麦体脂秤华为体脂秤_华为、小米和有品体脂秤哪个品牌好?三款智能体脂秤横评结果排行...

如今生活水平的提高,也让更多人开始关注健康问题。由于大部分时间都忙于工作,本身就运动少、体重超标等等。如果长期得不到控制的话,会造成日后脂性肝炎、肝纤维化、肝癌,想想都可怕,在意识到这样的严重性,…

Guava常用工具类的使用

导航引言一、Lists.partition引言 本文用于记录工作中常用到的 Guava 工具类的使用。 依赖引入&#xff1a; <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>20.0</version></depend…

idea 调用c#接口_Dubbo 接口测试方法

一.直接通telnet然后用dubbo协议调用方法&#xff08;1&#xff09;在项目的配置文件中可以看到dubbo.protocol.port10022说明dubbo对外暴漏的端口为10022&#xff0c;直接用telnet访问此端口。telnet lcoalhost 10022然后就能看到说明连接成功。用ls查看服务查看服务下有那些方…

MySQL 面试问答

导航一、什么是回表查询&#xff1f;如何避免回表查询&#xff1f;二、为什么MySQL建议使用自增主键&#xff1f;什么是代理主键、业务主键&#xff1f;三、为什么MySQL建议单表不超过2000W数据&#xff1f;四、MySQL自增id用完了怎么办&#xff1f;五、MySQL自增主键是连续的吗…

tcs标准编写软件_【公益培训】知你所需 | 标准编写格式及TCS模板应用线上公益培训...

企业标准编写的水平及TCS工具使用的能力是实施企业标准化工作的基础。TCS标准编写软件是辅助标准编写的工具性软件&#xff0c;方便标准编写人员快捷准确的编写标准草案&#xff0c;有效提升标准供给质量。为贯彻落实疫情防控和助力企业复工复产工作&#xff0c;山东标准化协会…

Linux进阶之路——常用命令总结

一、帮助命令 help man type区分内建、外建命令 【扩展】关于内建命令与外建命令。 内建命令属于shell程序的一部分&#xff0c;包含一些比较简单的Linux命令。这些命令被写在/bin/bash 文件的 builtins 里面&#xff0c;由shell程序识别并在shell程序内部完成运行。通常在Li…

bios设置 联想m8000t_怎么进bios设置硬盘启动顺序

操作说明&#xff1a;1、不同电脑进BIOS按键不一样&#xff0c;常见的有del、F1、F2、Esc、enter、F8、F9等2、在电脑启动时&#xff0c;不停按Del、F2等按键会进入BIOS设置界面&#xff0c;开机按哪个键进BIOS设置BIOS类型一&#xff1a;CMOS Setup Utility1、启动时按Del进入…

MySQL 基础 ————事务与隔离级别总结

引言 在处理并发读或写时&#xff0c;可以通过实现一个由两种类型的锁组成的锁系统来解决问题&#xff1a; 共享锁&#xff08;shared lock&#xff09;和排它锁&#xff08;exclusive lock&#xff09;&#xff0c;也叫读锁&#xff08;read lock&#xff09;和写锁&#xff0…

32f407tim4时钟源频率_慎重选择时钟发生器,别让这俩指标影响你的ADC 「图片」...

系统设计师通常侧重于为应用选择最合适的数据转换器&#xff0c;在向数据转换器提供输入的时钟发生器件的选择上往往少有考虑。然而&#xff0c;如果不慎重考虑时钟发生器的相位噪声和抖动性能&#xff0c;数据转换器动态范围和线性度性能可能受到严重的影响。系统考虑因素采用…

Spring —— IoC 容器详解

引言 本篇博客总结自官网的《The IoC Container》&#xff0c;其中会结合王富强老师的《Spring揭秘》融入自己的语言和理解&#xff0c;争取通过这一篇文章彻底扫除spring IOC的盲区。 本文介绍什么是 IoC 容器&#xff0c;什么是 Bean&#xff0c;依赖&#xff0c;Bean Defi…

nvidia控制面板点了没反应win7_win7系统Nvidia控制面板怎么设置?

许多用户不知道Nvidia控制面板怎么设置?那么Nvidia控制面板如何设置呢?其实设置的方法很简单。接下来&#xff0c;小编就把Nvidia控制面板设置的方法告诉大家。1、首先在桌面右键点击选择NVIDIA控制面板。2、显卡的设置性能肯定是要高好了&#xff0c;所以在性能设置方面&…

切割 字符串_web前端如何使用字符串

一、字符串概述定义&#xff1a;字符串就是用单引号或者双引号包裹起来的&#xff0c;零个或多个排列在一起的字符。例如&#xff1a;’javascript‘, “”, “345” , ’9-11a$‘, “xiao_yuanLian”嵌套&#xff1a;字符串可以嵌套。在单引号包裹的字符串内部&#xff0c;应该…

卡尔曼_卡尔曼滤波最完整公式推导

卡尔曼滤波是一种利用线性系统状态方程&#xff0c;通过系统输入输出观测数据&#xff0c;对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响&#xff0c;所以最优估计也可看作是滤波过程。上面一段话来自百度百科&#xff0c;其实最核心的意思就是卡…

Redis 缓存实战——缓存、数据库一致性问题分析与解决方案

引言 缓存与数据库一致性的问题自从出现了缓存概念后就一直被提及&#xff0c;它是一个缓存方案的先天缺陷&#xff0c;只要存在缓存&#xff0c;就势必会讨论缓存与数据库一致性的问题。 一致性问题还广泛存在于各种分布式存储场景中&#xff0c;如主从一致性等等。 本篇博…

基于计算思维的python程序设计王彬丽期末考试题库_基于计算思维的程序设计类课程教学实践...

基于计算思维的程序设计类课程教学实践滕剑锋王玉锋王猛刘二林【摘要】摘要很多专业开设了程序设计类课程。如何在该课程教学中培养学生的创新能力是大家普遍考虑的问题。计算思维的提出对于解决该问题具有重要的指导意义。在此背景下&#xff0c;我们针对程序设计类课程的教学…

Java 多线程 —— AQS 详解

引言 AQS 是AbstractQuenedSynchronizer 的缩写&#xff0c;抽象的队列式同步器&#xff0c;它是除了java自带的synchronized关键字之外的锁机制。是 JUC 下的重要组件。 相关产物有&#xff1a;ReentrantLock、CountDownLatch、Semaphore、ReadWriteLock等。 一、AQS的设计…

的主机名_如何在Mac 上更改电脑的名称或本地局域网主机名?

我们知道&#xff0c;一台电脑有其设定的具体名称&#xff0c;电脑的名称和本地主机名用于在本地网络上识别您的电脑。当我们需要自定义电脑名称或本地局域网主机名时&#xff0c;则需要对其进行更改。那我们该如何更改呢&#xff1f;有需要的小伙伴们快和小编一起来看看吧~更改…

Java常用设计模式——观察者模式

导航一、行为描述二、角色关系三、代码示例一、行为描述 观察者会观察特定对象的状态变化&#xff0c;一旦状态有所变化或产生特定条件&#xff0c;被观察对象会通知给观察者&#xff0c; 而观察者则会依据通知信息采取特定处理措施。 举个例子&#xff0c;公司接到了一个大项…

dev控件swiftplot图滚动方法_无限轮播图使用Scroller就这么简单

前言这几天又拾起老本行&#xff0c;复习复习Android&#xff0c;才发现忘的差不多了&#xff0c;上午做了一个小Demo&#xff0c;配合Scroller做了一个轮播图&#xff0c;效果如下&#xff0c;但是不知为何&#xff0c;录制的GIF成这样&#xff0c;凑乎一下看看。原理是继承Vi…

JVM——CPU缓存架构与Java 内存模型

导航一、CPU缓存架构与一致性协议1.1 CPU缓存架构1.2 缓存行与伪共享问题1.3 MESI 缓存一致性协议1.4 伪共享的解决办法二、JMM Java 内存模型2.1 JMM 简介2.2 原子性、可见性、有序性2.3 八大内存交互操作2.4 happens-before 原则一、CPU缓存架构与一致性协议 1.1 CPU缓存架构…