Seata 的四种模式一览

ops/2024/9/18 12:33:14/ 标签: seata, 分布式事务, 分布式

文章目录

  • 1. XA模式
    • 1.1 两阶段提交
    • 1.2 Seata 的 XA 模型
    • 1.3 XA 优缺点
    • 1.4 实现XA模式
  • 2. AT 模式
    • 2.1 Seata 的 AT 模型
    • 2.2 AT 流程梳理
    • 2.3 AT 与 XA 的区别
    • 2.4 AT 的脏写问题
    • 2.5 AT 的优缺点
    • 2.6 实现 AT 模式
  • 3. TCC模式
    • 3.1 流程分析
    • 3.2 Seata的TCC模型
    • 3.3 优缺点
  • 4. SAGA模式
    • 4.1 原理
    • 4.2 优缺点
  • 5. 四种模式对比

在这里插入图片描述


本篇文章介绍 Seata 中的四种不同的事务模式的特点及优缺点及其使用场景。

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

无论哪种方案,都离不开 TC(事务协调者),也就是事务的协调者。


1. XA模式

XA 规范 是 X/Open 组织定义的分布式事务>分布式事务处理(DTP,Distributed Transaction Processing)标准,XA 规范描述了全局的 TM(事务管理者) 与局部的 RM(资源管理者) 之间的接口,几乎所有主流的数据库都对 XA 规范 提供了支持。

1.1 两阶段提交

XA 是一种规范,目前主流数据库都实现了这种规范,实现的原理都是 基于两阶段提交

正常情况:

在这里插入图片描述

异常情况:

在这里插入图片描述

一阶段:

  • 事务协调者通知每个事物参与者执行本地事务
  • 本地事务执行完成后报告事务执行状态给事务协调者,此时事务不提交,继续持有数据库锁

二阶段:

  • 事务协调者基于一阶段的报告来判断下一步操作
    • 如果一阶段都成功,则通知所有事务参与者,提交事务
    • 如果一阶段任意一个参与者失败,则通知所有事务参与者回滚事务

1.2 Seata 的 XA 模型

Seata 对原始的 XA 模式做了简单的封装和改造,以适应自己的事务模型,基本架构如图:

在这里插入图片描述

RM 一阶段的工作:

​ ① 注册分支事务到TC

​ ② 执行分支业务sql但不提交

​ ③ 报告执行状态到TC

TC 二阶段的工作:

  • TC检测各分支事务执行状态

    a.如果都成功,通知所有RM提交事务

    b.如果有失败,通知所有RM回滚事务

RM二阶段的工作:

  • 接收TC指令,提交或回滚事务

1.3 XA 优缺点

XA模式的优点是什么?

  • 事务的强一致性,满足ACID原则。
  • 常用数据库都支持,实现简单,并且没有代码侵入

XA模式的缺点是什么?

  • 因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差
  • 依赖关系型数据库实现事务

1.4 实现XA模式

Seata的starter已经完成了XA模式的自动装配,实现非常简单,步骤如下:

1)修改application.yml文件(每个参与事务的微服务),开启 XA 模式:

seata:data-source-proxy-mode: XA

2)给发起全局事务的入口方法添加 @GlobalTransactional 注解:

本例中是OrderServiceImpl中的create方法.

在这里插入图片描述

3)重启服务并测试

重启 order-service,再次测试,发现无论怎样,三个微服务都能成功回滚。

2. AT 模式

AT 模式同样是 分阶段提交的事务模型,不过缺弥补了 XA 模型中资源锁定周期过长的缺陷。

2.1 Seata 的 AT 模型

基本流程图:

在这里插入图片描述

阶段一 RM 的工作:

  • 注册全局事务及分支事务
  • 记录 undo-log(数据快照)
  • 执行业务sql并提交
  • 报告事务状态

阶段二提交时RM的工作:

  • 删除 undo-log 即可(异步)

阶段二回滚时RM的工作:

  • 根据 undo-log 恢复数据到更新前

2.2 AT 流程梳理

用一个真实的业务来梳理下AT模式的原理。

比如,现在又一个数据库表,记录用户余额:

idmoney
1100

其中一个分支业务要执行的SQL为:

update tb_account set money = money - 10 where id = 1

AT模式下,当前分支事务执行流程如下:

一阶段:

1)TM发起并注册全局事务到TC

2)TM调用分支事务

3)分支事务准备执行业务SQL

4)RM拦截业务SQL,根据where条件查询原始数据,形成快照。

{"id": 1, "money": 100
}

5)RM执行业务SQL,提交本地事务,释放数据库锁。此时 money = 90

6)RM报告本地事务状态给TC

二阶段:

1)TM通知TC事务结束

2)TC检查分支事务状态

​ a)如果都成功,则立即删除快照.

​ b)如果有分支事务失败,需要回滚。读取快照数据({"id": 1, "money": 100}),将快照恢复到数据库。此时数据库再次恢复为100

流程图:

在这里插入图片描述

2.3 AT 与 XA 的区别

简述AT模式与XA模式最大的区别是什么?

  • XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。
  • XA模式依赖数据库机制实现回滚;AT模式利用数据快照实现数据回滚。
  • XA模式强一致;AT模式最终一致

2.4 AT 的脏写问题

在多线程并发访问AT模式的分布式事务>分布式事务时,有可能出现脏写问题,如图:

在这里插入图片描述

解决思路就是引入了全局锁的概念。在释放DB锁之前,先拿到全局锁。避免同一时刻有另外一个事务来操作当前数据。

在这里插入图片描述

2.5 AT 的优缺点

AT模式的优点:

  • 一阶段完成直接提交事务,释放数据库资源,性能比较好
  • 利用全局锁实现读写隔离
  • 没有代码侵入,框架自动完成回滚和提交

AT模式的缺点:

  • 两阶段之间属于软状态,属于最终一致
  • 框架的快照功能会影响性能,但比XA模式要好很多

2.6 实现 AT 模式

AT 模式中的快照生成、回滚等动作都是由框架自动完成,没有任何代码侵入,因此实现非常简单。

只不过,AT模式需要一个表来记录全局锁、另一张表来记录数据快照undo_log。

1)导入数据库表,记录全局锁

2)修改application.yml文件,将事务模式修改为AT模式即可:

seata:data-source-proxy-mode: AT # 默认就是AT

3)重启服务并测试


3. TCC模式

TCC 模式与 AT 模式非常相似,每阶段都是独立事务,不同的是 TCC 通过人工编码来实现数据恢复。需要实现三个方法:

  • Try:资源的检测和预留;

  • Confirm:完成资源操作业务;要求 Try 成功 Confirm 一定要能成功。

  • Cancel:预留资源释放,可以理解为try的反向操作。

3.1 流程分析

举例,一个扣减用户余额的业务。假设账户A原来余额是100,需要余额扣减30元。

  • 阶段一( Try ):检查余额是否充足,如果充足则冻结金额增加30元,可用余额扣除30

初识余额:

在这里插入图片描述
余额充足,可以冻结:

在这里插入图片描述
此时,总金额 = 冻结金额 + 可用金额,数量依然是100不变。事务直接提交无需等待其它事务。

  • 阶段二(Confirm):假如要提交(Confirm),则冻结金额扣减30

确认可以提交,不过之前可用金额已经扣减过了,这里只要清除冻结金额就好了:

在这里插入图片描述
此时,总金额 = 冻结金额 + 可用金额 = 0 + 70 = 70元

  • 阶段二(Canncel):如果要回滚(Cancel),则冻结金额扣减30,可用余额增加30

需要回滚,那么就要释放冻结金额,恢复可用金额:

在这里插入图片描述


3.2 Seata的TCC模型

Seata 中的 TCC 模型依然延续之前的事务架构,如图:

在这里插入图片描述

3.3 优缺点

TCC模式的每个阶段是做什么的?

  • Try:资源检查和预留
  • Confirm:业务执行和提交
  • Cancel:预留资源的释放

TCC的优点是什么?

  • 一阶段完成直接提交事务,释放数据库资源,性能好
  • 相比AT模型,无需生成快照,无需使用全局锁,性能最强
  • 不依赖数据库事务,而是依赖补偿操作,可以用于非事务型数据库

TCC的缺点是什么?

  • 有代码侵入,需要人为编写try、Confirm和Cancel接口,太麻烦
  • 软状态,事务是最终一致
  • 需要考虑Confirm和Cancel的失败情况,做好幂等处理

4. SAGA模式

Saga 模式是 Seata 即将开源的长事务解决方案,将由蚂蚁金服主要贡献。

其理论基础是 Hector & Kenneth 在1987年发表的论文 Sagas。

Seata官网对于Saga的指南:https://seata.io/zh-cn/docs/user/saga.html

4.1 原理

在 Saga 模式下,分布式事务>分布式事务内有多个参与者,每一个参与者都是一个冲正补偿服务,需要用户根据业务场景实现其正向操作和逆向回滚操作。

分布式事务>分布式事务执行过程中,依次执行各参与者的正向操作,如果所有正向操作均执行成功,那么分布式事务>分布式事务提交。如果任何一个正向操作执行失败,那么分布式事务>分布式事务会去退回去执行前面各参与者的逆向回滚操作,回滚已提交的参与者,使分布式事务>分布式事务回到初始状态。

在这里插入图片描述

Saga也分为两个阶段:

  • 一阶段:直接提交本地事务
  • 二阶段:成功则什么都不做;失败则通过编写补偿业务来回滚

4.2 优缺点

优点:

  • 事务参与者可以基于事件驱动实现异步调用,吞吐高
  • 一阶段直接提交事务,无锁,性能好
  • 不用编写TCC中的三个阶段,实现简单

缺点:

  • 软状态持续时间不确定,时效性差
  • 没有锁,没有事务隔离,会有脏写

5. 四种模式对比

从以下几个方面来对比四种实现:

  • 一致性:能否保证事务的一致性?强一致还是最终一致?
  • 隔离性:事务之间的隔离性如何?
  • 代码侵入:是否需要对业务代码改造?
  • 性能:有无性能损耗?
  • 场景:常见的业务场景
XAATTCCSAGA
一致性强一致性弱一致性弱一致性最终一致
隔离性完全隔离基于全局锁隔离基于资源预留隔离无隔离
代码侵入有, 要编写三个接口有, 要编写状态机和补偿业务
性能非常好非常好
场景对一致性,隔离性有高要求的业务基于关系型数据库的大多数分布式事务>分布式事务场景都可以对性能要求较高的事务. 有非关系型数据库要参与的事务业务流程长, 业务流程多. 参与者包含其他公司或遗留系统服务, 无法提供 TCC 模式要求的三个接口的业务




http://www.ppmy.cn/ops/102880.html

相关文章

携程:从MySQL迁移OceanBase的数据库发布系统实践

作者简介:杨晓军 现就职于携程的数据库团队,主要负责携程数据库的研发与管理,专注于提升数据库的稳定性。 自分布式关系型数据库OceanBase开源以来,携程已经在线上环境中进行了广泛的应用,取代了原先以MySQL为主力的业…

基于 XILINX FPGA 的 Cameralink Full 模式相机采集系统技术分析方案

《基于 XILINX FPGA 的 Cameralink Full 模式相机采集系统技术分析方案》 **一、引言** 随着科技的不断发展,对图像采集和处理的要求越来越高。基于 XILINX FPGA 的 Cameralink Full 模式相机采集系统以其强大的功能和高性能,为众多领域提供了高效的图…

RabbitMQ 集群与高可用性

目录 单节点与集群部署 1.1. 单节点部署 1.2. 集群部署 镜像队列 1.定义与工作原理 2. 配置镜像队列 3.应用场景 4. 优缺点 5. Java 示例 分布式部署 1. 分布式部署的主要目标 2. 典型架构设计 3. RabbitMQ 分布式部署的关键技术 4. 部署策略和实践 5. 分布式部署…

垃圾收集器与内存分配策略

对象引用以及回收 如何判断对象已死 引用计数算法 在对象当中添加一个引用计数器,每当有一个地方引用它,计数器就加一,引用失效的时候,计数器减一,初始化计数器为1,当计数器为0的时候,对象就…

Spring Boot常用注解及其含义

Spring Boot常用注解及其含义 注解含义SpringBootApplication标记主应用程序类,包含Configuration、EnableAutoConfiguration和ComponentScan。EnableAutoConfiguration启用Spring Boot的自动配置功能,根据类路径中的依赖自动配置应用程序。Configurati…

黑神话悟空-俯视地图-真实光线-修改视野-人物替换 合集mod

俯视地图说明:使用后就可以在游戏内打开俯瞰大地图,来确认各种支线,并且还能看到地图上给玩家准备好的标记,不需要查询攻略就能轻松做完支线。 N键-打开俯瞰模式 十字键—移动镜头 鼠标滚轮-缩放 O键-镜头复位 I键&#xff1a…

Golang小项目(1)

Golang小项目(1) 前言 本项目适合Golang初学者,通过简单的项目实践来加深对Golang的基本语法和Web开发的理解。 建议前往 torna.top 查阅效果更佳 项目结构 . ├── main.go └── static├── form.html└── index.html项目流程图 定义三个路由: /:首页,显示static…

网站上线3个多月了,还没有被百度收录怎么办?

如果你上线的新网站长期都不被百度搜索引擎所收录(内容更新后超过一个星期),或者甚至连网站的首页都没有收录结果。那么你一定要看看这篇文章,这里将介绍百度搜索引擎收录规则的变化以及站长应该怎么优化自己网站的方法。说实话&a…

VTK随笔六:VTK图像处理(图像创建、图像显示)

一、VTK图像创建 1、VTK 图像数据结构 数字图像文件内容由两个部分组成:图像头信息和数据。图像头信息定义了图像的基本信息,主要包括起点位置(Origin)、像素间隔(Space)和维数(Dimension)。通过这三个参数即可确定图像空间位置和大小。 图像数据即为图像像素的像素…

SEO之网站结构优化(十三-网站地图)

** 初创企业搭建网站的朋友看1号文章;想学习云计算,怎么入门看2号文章谢谢支持: ** 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客:阿幸SEO~探索搜索排名之道 网站无论大小&…

[MRCTF2020]pyFlag(详解附送多个python脚本)

Hex: FF D9 5B 53 65 63 72 65 74 20 46 69 6C 65 20 50 61 72 74 20 31 3A 5D ASCII: [Secret File Part 1:] 发现Setsuna.jpg尾部有多余的一部分有左侧窗口pk头&a…

【C语言进阶】C语言指针进阶实战:优化与难题解析

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C语言 “ 登神长阶 ” 🤡往期回顾🤡:C语言指针进阶 (上) 🌹🌹期待您的关注 🌹🌹 ❀C语言指针进阶 &#x…

基于Prometheus和Grafana的现代服务器监控体系构建

基于Prometheus和Grafana的现代服务器监控体系构建 在当前的数字时代,实时监控已经成为企业和组织运营中不可或缺的一部分。随着微服务架构和容器技术的普及,传统的监控方法已难以满足业务需求。Prometheus和Grafana作为两个非常受欢迎的开源项目&#…

Django的Form和ModeForm的作用

Django的Form和ModelForm是Django框架中用于处理表单数据的两个重要组件,它们简化了表单数据的验证、渲染和处理过程。尽管它们都用于处理表单,但它们之间有一些关键的区别和用途。 Django Form Form是Django中用于处理任何类型数据的表单的基础。它不…

TimeWheel算法介绍及在应用上的探索

作者:来自 vivo 互联网服务器团队- Li Fan 本文从追溯时间轮算法的出现,介绍了时间轮算法未出现前,基于队列的定时任务实现,以及基于队列的定时任务实现所存在的缺陷。接着我们介绍了时间轮算法的算法思想及其数据结构&#xff0c…

Python中的`while`循环:探索无限可能

引言 while循环允许我们重复执行一段代码块,直到指定条件不再满足为止。这种机制非常适合处理那些不确定具体重复次数的任务场景,比如读取文件直到末尾、定时任务执行等。掌握好while循环,不仅能让你的代码更加高效、简洁,还能帮…

基于Spring Boot的文字识别系统

前端使用htmlcssjs,后端使用Spring Boot,数据库使用mysql,识别算法有两个,一个是使用百度OCR接口,一个是自己写一个python,用flask包装。 其中百度OCR接口可以去免费申请,然后把appid、apikey、…

spring ioc是做什么的?

Spring框架的IOC(Inversion of Control,控制反转)是Spring框架的一个核心特性,它主要解决的是对象管理和依赖管理的问题。下面我将简要解释Spring IOC的主要作用: 什么是Spring IOC? 控制反转:…

java在项目中实现excel导入导出

一、初识EasyExcel* 1. Apache POI 先说POI,有过报表导入导出经验的同学,应该听过或者使用。 Apache POI是Apache软件基金会的开源函式库,提供跨平台的Java API实现Microsoft Office格式档案读写。但是存在如下一些问题: 1.1 …

R语言统计分析——方差分析之ANOVA模型拟合

参考资料:R语言实战【第2版】 1、aov()函数 aov()函数的语法为aov(formula,datadataframe),下表中列举了表达式中可以使用的特殊符号。其中,y是因变量,字母A、B、C代表因子。如下: 符号用法~分隔符,左边为…