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,一经查实,立即删除!

相关文章

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

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

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

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

MySQL 面试问答

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

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

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

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

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

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

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

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

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

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

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

Spring —— IoC 容器详解

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

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

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

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

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

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

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

Java 多线程 —— AQS 详解

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

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

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

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

前言这几天又拾起老本行,复习复习Android,才发现忘的差不多了,上午做了一个小Demo,配合Scroller做了一个轮播图,效果如下,但是不知为何,录制的GIF成这样,凑乎一下看看。原理是继承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缓存架构…

白噪声检测_科学家尝试用智能扬声器的白噪声来监测婴儿的呼吸运动

华盛顿大学的一支研究团队,刚刚介绍了他们开发的一种新型智能扬声器技术。这种设备能够借助白噪声来安抚熟睡的婴儿,并监测他们的呼吸和运动。具体说来是,通过智能扬声器发出的白噪声,原型设备能够将之与生命体征监测仪的数据相匹…

最大值_285期 博最大值2路,已经箭在弦上!

往期数据P-5掉码 跨度 和尾 012断路 余数和 位数86072 1 8 4 200 断1路2 5 对214对 双双双79703 0 2 3 101 断2路2 4 对215对 单单单62386 0 4 1 020 断1路2 4 错216对 双双单71903 0 8 7 110 断2路2 5 错217对 单单单64838 0 4 8 012 来3路3 4 错218对 双双双02052 0 2 2 020 …

商品领域ddd_为 Gopher 打造 DDD 系列:领域模型-资源库

前言: 作为领域模型中最重要的环节之一的Repository,其通过对外暴露接口屏蔽了内部的复杂性,又有其隐式写时复制的巧妙代码设计,完美的将DDD中的Repository的概念与代码相结合!Repository资源库通常标识一个存储的区域…

mysql5.7主从全备恢复_Mysql5.7—运维常用备份方式(超全)

小生博客:http://xsboke.blog.51cto.com小生 Q Q:1770058260-------谢谢您的参考,如有疑问,欢迎交流一、 Mysqldump备份结合binlog日志恢复使用mysqldump进行全库备份,并使用binlog日志备份,还原时&#xf…