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

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
性能测试 PTS,5000VUM额度
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 阿里分布式中间件Seata从入门到精通

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

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

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

微信图片_20221213103454.png

微信图片_20221213103514.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阶段

如下图:

微信图片_20221213103542.png

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

commit阶段

如下图:

微信图片_20221213103602.png

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

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

Saga 模式

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

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

微信图片_20221213103628.png

XA 模式

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

微信图片_20221213103652.png

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

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

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

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

目录
打赏
0
11
14
36
114
分享
相关文章
OceanBase 入门:分布式数据库的基础概念
【8月更文第31天】在当今的大数据时代,随着业务规模的不断扩大,传统的单机数据库已经难以满足高并发、大数据量的应用需求。分布式数据库应运而生,成为解决这一问题的有效方案之一。本文将介绍一款由阿里巴巴集团自主研发的分布式数据库——OceanBase,并通过一些基础概念和实际代码示例来帮助读者理解其工作原理。
659 0
微服务SpringCloud分布式事务之Seata
SpringCloud+SpringCloudAlibaba的Seata实现分布式事务,步骤超详细,附带视频教程
167 1
大厂都在用的分布式事务方案,Seata+RocketMQ带你打破10万QPS瓶颈
分布式事务涉及跨多个数据库或服务的操作,确保数据一致性。本地事务通过数据库直接支持ACID特性,而分布式事务则需解决跨服务协调难、高并发压力及性能与一致性权衡等问题。常见的解决方案包括两阶段提交(2PC)、Seata提供的AT和TCC模式、以及基于消息队列的最终一致性方案。这些方法各有优劣,适用于不同业务场景,选择合适的方案需综合考虑业务需求、系统规模和技术团队能力。
728 7
‘分布式事务‘ 圣经:从入门到精通,架构师尼恩最新、最全详解 (50+图文4万字全面总结 )
本文 是 基于尼恩之前写的一篇 分布式事务的文章 升级而来 , 尼恩之前写的 分布式事务的文章, 在全网阅读量 100万次以上 , 被很多培训机构 作为 顶级教程。 此文修改了 老版本的 一个大bug , 大家不要再看老版本啦。
SpringCloud基础6——分布式事务,Seata
分布式事务、ACID原则、CAP定理、Seata、Seata的四种分布式方案:XA、AT、TCC、SAGA模式
SpringCloud基础6——分布式事务,Seata
PyTorch与DistributedDataParallel:分布式训练入门指南
【8月更文第27天】随着深度学习模型变得越来越复杂,单一GPU已经无法满足训练大规模模型的需求。分布式训练成为了加速模型训练的关键技术之一。PyTorch 提供了多种工具来支持分布式训练,其中 DistributedDataParallel (DDP) 是一个非常受欢迎且易用的选择。本文将详细介绍如何使用 PyTorch 的 DDP 模块来进行分布式训练,并通过一个简单的示例来演示其使用方法。
1056 2
消息中间件的选择:RabbitMQ是一个明智的选择
消息中间件的选择:RabbitMQ是一个明智的选择
148 0
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
3873 0
Docker部署RabbitMQ消息中间件
【7月更文挑战第4天】Docker部署RabbitMQ消息中间件
330 3
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等