阿里分布式中间件Seata从入门到精通

最近在写一本关于阿里巴巴分布式事务中间件 Seata 的电子书,Seata可以说是分布式事务中间件中最完善的了,包括了 AT、TCC、Saga、XA 四种模式,目前 Seata 已经更新到了 1.4.2 版本。

这本电子书主要分成两部分,第一部分是入门学习,目前已经更新完成,第二部分是源码解读,Seata 的源代码写的还可以,值得阅读。

整本书目前的目录结构如下:

ff866d1c15d0e93e179d9be04f13644c.png05896c8610d18faa66b8f78f0f82ef04.png

喜欢的朋友欢迎下载学习。获取方式:关注公众号,后台回复:Seata

下面简要介绍 Seata 的四种模式。

AT 模式

AT 模式参考了单数据库的事务原理,我们可以把分布式事务中每个数据库看做是单数据库的表。首先每个事务有一个全局的事务 id,叫做 xid。有了这个 xid 后,我们就可以记录undo_log 了,undo_log 中记录了这个 xid 对应回滚数据,每次提交事务前都要先写 undo_log,后提交事务,这参考了 mysql 中的 WAL 机制。而rollback_info 字段记录了要回滚的表的记录中的每个字段和对应值,这样就可以方便的回滚了。

AT模式的两阶段提交体现如下:

  • 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。

  • 二阶段:异步 commit,非常快速地完成。rollback 则通过一阶段的回滚日志进行反向补偿

AT 模式读写都有隔离性,这里简单描述。

写隔离

  • 一阶段本地事务提交前,需要确保先拿到**全局锁* 。

  • 拿不到全局锁 ,不能提交本地事务。

  • 全局锁的尝试会有超时时间限制,超出范围将放弃,并回滚本地事务,释放本地锁。

上面是官网的描述,非常容易理解,如果获取不到全局锁,就不能提交本地事务,只能等待全局锁直到超时。

读隔离

AT模式的读隔离需要本地事务隔离级别在读已提交或以上,AT 模式默认的全局隔离级别是读未提交

如果应用在特定场景下,必需要求全局的读已提交 ,Seata 需要通过 SELECT FOR UPDATE 语句代理来实现。

SELECT FOR UPDATE 语句的执行会申请全局锁 ,如果全局锁被其他事务持有,则释放本地锁并重试。这个过程中,查询是被 block 住的,直到全局锁拿到。

TCC 模式

简单来讲,TCC模式就是将整个事务分成两个阶段来提交,try阶段进行预留资源,如果所有分支都预留成功,则进入commit阶段提交所有分支事务,否则执行cancel取消所有分支事务。

以电商系统为例,假如有订单、库存和账户3个服务,客户购买一件商品,订单服务增加订单,库存服务扣减库存,账户服务扣减金额,这三个操作必须是原子性的,要么全部成功,要么全部失败。

try阶段

如下图:

43ba6937f6548cb47d5c765861012cc3.png

订单服务增加一个订单,库存服务冻结订单上的库存,账户服务冻结订单上的金额。这个阶段数据进入中间态。

commit阶段

如下图:

b47254a2f20221551d29e61f368c03a1.png

commit阶段,数据从中间态转入终态,比如订单金额从中间账户转到最终账户。

cancel阶段跟commit阶段类似,比如订单金额从中间账户退回到客户账户。

Saga 模式

Saga 模式适用于长流程的业务场景,用状态机来控制整个事务的执行。它使用状态图定义服务调用流程并生成 Json 状态语言定义文件,状态图的节点可以是一个服务,也可以是补偿节点。

下面这张图定义了电商系统的业务流程,根据这个流程图可以定义出 Json 文件中供状态机使用。

c18a0ebf10a8d9e8e4b95acd1865d136.png

XA 模式

XA 模式需要分支事务数据库支持 XA 原语,看一下官方这张图:

3c3d5ecc22593ff4c51824f6844d1dbe.pngXA 模式的两阶段提交跟 TCC 模式的两阶段提交类似,都是由 TM 开启全局事务,RM 向 TC注册分支事务并且报告分支事务状态,TC 根据全局事务的状态来提交或回滚分支事务。

而在代码实现上,XA 模式使用的是数据源代理来实现的。跟 TCC 模式不同的是,XA 模式只要有 prepare 方法即可。

Seata 对XA做了优化,把 Start | SQL | Prepare 合成了一个阶段。这对 MySQL 数据库是支持的,但是对 Oracle 数据库不支持。

最后,欢迎大家支持这本电子书,后面我会逐渐完善第二部分,我个人非常推荐。

号内回复 Seata 可以提取

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

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

相关文章

Android之Gradle Plugin Samples 之Gradle Library Projects

Gradle Library Projects Gradle 项目可以依赖于其它组件。这些组件可以是外部二进制包,或者是其它的 Gradle 项目。 在本例中, app/build.gradle 中有以下内容: dependencies { compile fileTree(dir: libs, include: [*.jar]) compile com.android.support:appcompat-v7:…

sql两个列值以下划线拼接得到一个新的列_面试必备sql知识点——MySQL基础

在刷了上百道sql题后,发现所有的题目都是基于某一个或几个知识点来做考察的,所以理清基础的知识细节,才能在题目考察到任意知识点时,找到解决线索。温故而知新,学习在于总结,于是我再次对已经学习过的mysql…

为什么不能除以0?

全世界只有3.14 % 的人关注了爆炸吧知识说出来你可能不信但这是真的今天学习了除法的表妹跑来问我:为什么不能除以0?就这个问题,我专门请来了高冷的Siri。同样是数字,0为什么就会这么惨呢?小学生小学老师会直接给你来一…

构造函数、析构函数

构造函数、析构函数// Employee.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <string.h> #include <iostream.h> class Employee //定义员工类Employee{ private: char EmployeeID[20]; …

一步步构建大型网站架构

之前我简单向大家介绍了各个知名大型网站的架构&#xff0c;MySpace的五个里程碑、Flickr的架构、YouTube的架构、PlentyOfFish的架构、WikiPedia的架构。这几个都很典型&#xff0c;我们可以从中获取很多有关网站架构方面的知识&#xff0c;看了之后你会发现你原来的想法很可能…

为什么 Dictionary 没有 AddRange 方法?

咨询区 Custodio&#xff1a;我一直都有一个疑惑&#xff1f;那就是为啥 Dictionary 不提供 AddRange 方法呢&#xff1f;回答区 Rafal Zajac&#xff1a;我觉得 Dictionary 之所以没有提供 AddRange 方法&#xff0c;主要还是考虑当遇到重复key的时候该如何处理&#xff1f;比…

Android之webview与js交互

对于android初学者应该都了解webView这个组件。之前我也是对其进行了一些简单的了解&#xff0c;但是在一个项目中不得不用webview的时候&#xff0c;发现了webview的强大之处&#xff0c;今天就分享一下使用webview的一些经验。 1、首先了解一下webview。 webview介绍的原文如…

java.util.ResourceBundle使用详解

java.util.ResourceBundle使用详解一、认识国际化资源文件这个类提供软件国际化的捷径。通过此类&#xff0c;可以使您所编写的程序可以&#xff1a;轻松地本地化或翻译成不同的语言一次处理多个语言环境以后可以轻松地进行修改&#xff0c;支持更多的语言环境说的简单点&#…

12如何隐藏dock栏_iPhone边框“变色”壁纸,隐藏Dock栏

自从iOS14上线以来&#xff0c;iPhone的玩法真的是花样百出&#xff0c;今天给大家带来一组很有意思的iPhone专用壁纸&#xff0c;不仅拥有色彩边框&#xff0c;还能隐藏主屏界面底部的Dock栏。这组壁纸除了外边框自带颜色以外&#xff0c;锁屏界面的通知栏和底部两个按钮的位置…

IE开发人员工具无法使用

第一种情况&#xff1a;开发人员工具只在任务栏显示&#xff0c;桌面上看不到&#xff08;我遇到的是这种情况&#xff0c;解决方法如下&#xff09; 将鼠标放在任务栏的开发者工具&#xff0c;出现缩略图&#xff0c;也就是任务栏上方的预览图&#xff0c;可以看到开发人员工具…

微信新功能又来了,这些功能再次打开了我新世界的大门!

全世界只有3.14 % 的人关注了爆炸吧知识微信视频号&#xff0c;是一个人人都可记录和创作的内容平台&#xff0c;也是一个了解他人、了解世界的窗口。在过去一段时间里&#xff0c;视频号可能是微信迭代最多&#xff0c;变化最多&#xff0c;也受到最多关注的功能。内容创作者大…

Processing编译android的apk应用

折腾了3天&#xff0c;总算弄进去了&#xff0c;真麻烦~&#xff01; 成果如下&#xff1a; 转载于:https://www.cnblogs.com/x5115x/archive/2013/04/11/3013593.html

EF Core 小技巧:迁移已经应用到数据库,如何进行迁移回退操作?

场景描述&#xff1a;项目中存在两个迁移 Teacher 和 TeachingPlan &#xff0c;TeachingPlan 在 Teacher 之后创建&#xff0c;并且已经执行 dotnet ef database update 将新迁移应用到数据库。此时&#xff0c;因为实体修改&#xff0c;我们希望删除 TeachingPlan 迁移然后创…

Android之DiskLruCache(缓存工具)

DiskLruCache DiskLruCache是一个十分好用的android缓存工具&#xff0c;我们可以从GitHub上下载其源码&#xff1a;https://github.com/JakeWharton/DiskLruCache DiskLruCache所有的数据都存储在/storage/emulated/0/Android/data/应用包名/cache/XXX文件夹中(你也可以修改&…

手机自动化测试:appium源码分析之bootstrap七

手机自动化测试&#xff1a;appium源码分析之bootstrap七poptest是国内唯一一家培养测试开发工程师的培训机构&#xff0c;以学员能胜任自动化测试&#xff0c;性能测试&#xff0c;测试工具开发等工作为目标。poptest测试开发工程师就业培训请大家咨询qq&#xff1a;908821478…

内核中根据inode得到文件名_聊聊DOS操作系统中的文件系统FAT12

前面我们更多的集中在Linux系统下文件系统的介绍&#xff0c;是时候介绍一下其它文件系统了。今天我们介绍一下Windows操作系统下的文件系统&#xff0c;也就是FAT文件系统。严格的来说其实是DOS的文件系统。今天我们介绍一下FAT最古老的版本&#xff0c;FAT12文件系统的内容。…

改变世界面貌的十个数学公式

全世界只有3.14 % 的人关注了爆炸吧知识1971年5月15日&#xff0c;尼加拉瓜发行了十张一套题为“改变世界面貌的十个数学公式”邮票&#xff0c;由一些著名数学家选出十个以世界发展极有影响的公式来表彰。这十个公式不但造福人类&#xff0c;而且具有典型的数学美&#xff0c;…

【2006-1】【字符统计】

Description 输入一串字符&#xff0c;将数字字符、字母字符和其它字符分别计数&#xff0c;并输出计数的结果&#xff0c;输入的字符以“?”号结束&#xff0c;“?”号不计数。输出共有3行&#xff0c;分别为输入文件中的数字字符、字母字符和其它字符的数目。 Input 字符串…

Java开源门户

最近在研究门户&#xff0c;先整理一下开源内容 GateIn&#xff1a; 新的开源门户平台&#xff0c;由RedHat JBoss和eXo平台共同打造。目标是结合强大的企业级Java基础设施和直观友好的用户界面&#xff0c;根据客户的需求&#xff0c;提供最佳的开源门户平台的企业级Java基础设…

.NET 6新特性试用 | 最小Web API

前言如果你使用过其他一些轻量级Web框架&#xff0c;比如Node.JS&#xff0c;你就会知道&#xff0c;创建具有最小依赖项的HTTP API是多么简单&#xff1a;var express require(express) var app express()app.get(/, function (req, res) {res.send(hello My IO!) })app.lis…