解决分布式事务的方案 —— Seata

解决分布式事务的方案 —— Seata

1. 认识 Seata

解决分布式事务的方案有很多,但实现起来都比较复杂,因此我们一般会使用开源的框架来解决分布式事务问题。在众多的开源分布式事务框架中,功能最完善、使用最多的就是阿里巴巴在 2019 年开源的 Seata 了。

Seata 的事务管理中有三个重要的角色:

  • TC(Transaction Coordinator)事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚,相当于监控中心。
  • TM(Transaction Manager)事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。
  • RM(Resource Manager)资源管理器:管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

2. 微服务集成 Seata

引入依赖

<!-- seata -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

修改配置

seata:registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址type: nacos # 注册中心类型 nacosnacos:server-addr: 192.168.101.68:8848 # nacos地址namespace: "" # namespace,默认为空group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUPapplication: seata-server # seata服务名称tx-service-group: hmall # 事务组名称service:vgroup-mapping: # 事务组与tc集群的映射关系hmall: "default"

3. Seata 工作模式

Seata 支持四种不同的分布式事务解决方案,Seata 默认使用的是 AT 模式:

  1. AT
  2. XA
  3. TCC
  4. SAGA

这四种方案可以满足 CP 和 AP 的需求,比如:XA 可以实现 CP 即强一致性,AT 可以实现 AP 最终一致性,四种模式中 AT 模式使用较多,本课程重点讲解AT模式。

3.1 AT 模式

工作流程图


流程说明:

  1. TM 通知 TC 开启全局事务,TC 记录全局事务状态;
  2. TM 调用所有 RM,开始执行分支事务,然后 RM 向 TC 注册分支事务;
  3. RM 执行自己的 sql 并进行提交,同时记录日志到 undolog 表中;
  4. RM 向 TC 汇报自己事务执行的状态;
  5. TM 通知 TC,提交或回滚全局全局事务。TC 汇总所有 RM 的事务执行情况,并通知所有 RM 执行提交或回滚操作
    1. 提交:删除 undolog 表中的日志
    2. 回滚:RM 根据各自 undolog 表中的日志,反向操作,操作成功后删除 undolog 中的日志

3.2 XA 模式

工作流程图


流程说明:

  1. TM 通知 TC 开启全局事务,TC 记录全局事务状态;
  2. TM 通知所有 RM,开始执行分支事务,然后 RM 向 TC 注册分支事务;
  3. RM 执行自己的 sql,然后向 TC 报告自己执行的事务状态;
  4. TM 通知 TC,提交或回滚全局事务。TM 汇总所有 RM 分支的事务状态,并通知所有 RM 执行提交或回滚的操作。

可见,AT 模式使用起来更加简单,无业务侵入,性能更好。因此企业 90% 的分布式事务都可以用 AT 模式来解决。

3.3 TCC 模式

工作流程图

流程:

  1. TM 通知 TC 开启全局事务,TC 记录全局事务状态;
  2. TM 通知 RM 执行分支事务,RM 向 TC 注册分支事务;
  3. RM 对将要操作的资源进行检测和预留,将要执行的资源单独分出来,并向 TC 汇报所执行的事务状态;
  4. TM 通知 TC,提交或回滚全局事务。TC 统计汇总所有 RM 分支事务状态,并通知所有 RM 执行提交或回滚的操作
    1. 提交:RM 执行 Congirm 操作,真正执行数据
    2. 回滚:RM 执行 cancel 操作,将隔离出来的资源返回

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

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

3.4 SAGA 模式

工作流程图

流程:

  1. TM 通知 TC 开启全局事务,TC 记录全局事务;
  2. TM 通知所有 RM 执行分支事务,RM 向 TC 注册分支事务;
  3. RM 执行自己的 sql 业务,并向 TC 汇报分支事务执行的状态;
  4. TM 通知 TC 提交或回滚全局事务。TC 汇总所有 RM 的事务状态,并通知所有 RM 执行提交或回滚
    1. 提交:RM 执行提交操作
    2. 回滚:RM 通过回滚机制和补偿机制进行回滚操作。

4. 小结

4.1 Seata 是怎么进行分布式事务控制的?

使用 Seata 的 AT 模式,AT 模式的底层使用的是 CAP 的 CP,保证数据的最终一致性。

4.2 Seata 的工作原理?

首先,Seata 是一个专门用于处理分布式事务的开源框架,它通过定义全局事务和分支事务的概念来实现分布式事务的控制,并支持多种模式,如 AT 模式、TCC 模式、SAGA 模式等。

核心概念:

  1. 事务协调器(TC):维护全局事务和分支事务的状态,并驱动全局事务的提交或回滚。
  2. 事务管理器(TM):定义全局事务的边界,即开始和结束全局事务。
  3. 资源管理器(RM):管理分支事务并报告分支事务的状态给 TC,同时也负责分支事务的提交或回滚。

工作原理:

  1. 开始全局事务:TM 通知 TC 开启一个全局事务,TC 生成一个全局唯一的 XID 用于标识这个全局事务。
  2. 执行分支事务:TM 通知 RM 执行分支事务,执行完成后向 TC 报告分支事务的状态。
  3. 提交或回滚全局事务
    • 当所有分支事务都成功完成,TM 通知 TC 提交全局事务,TC 随后指示各个 RM 提交对应的分支事务。
    • 如果任何一个分支事务失败,TM 会通知 TC 回滚全局事务,TC 会指令各 RM 回滚各自的分支事务。

分布式事务模式

  • AT 模式:一种无侵入式的分布式事务解决方案,基于数据库的 ACID 特性,自动完成数据的快照和补偿操作,适合对业务代码侵入性要求较低的场景。
  • TCC 模式:需要业务系统提供 Try、Confirm、Cancel 三个方法接口,适用于对一致性要求较高且能够接受一定程度业务侵入的场景。
  • SAGA 模式:长事务解决方案,适用于长时间运行的业务流程,通过一系列子事务及其补偿操作来保证最终一致性。

通过上述机制,Seata 实现了对分布式事务的有效管理和控制,也能够保证事务的一致性和可靠性。

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

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

相关文章

Antd实现上传下载csv文件

1 上传 解析csv文件&#xff1a; import { parse } from papaparse;export function parseCSV(file: File): Promise<string[][]> {return new Promise((resolve, reject) > {const reader new FileReader();reader.onload () > {const csvData reader.result…

Asp.net Core API 本地化

本文是一个demo&#xff0c;演示了如何根据用户接口查询字段(正常放header中),设置当前culture&#xff0c;并获取当前culture的key value给用户提示 创建Resources文件夹&#xff0c;添加以下三个文件 其中ExceptionUnuse 是一个空的类&#xff0c;供IStringLocalizer使用&a…

MambaVision:一种Mamba-Transformer混合视觉骨干网络

摘要 我们提出了一种新型混合Mamba-Transformer主干网络&#xff0c;称为MambaVision&#xff0c;该网络专为视觉应用而设计。我们的核心贡献包括重新设计Mamba公式&#xff0c;以增强其对视觉特征的高效建模能力。此外&#xff0c;我们还对将视觉Transformer&#xff08;ViT&…

{瞎掰} 手机安装app问题:app签名,手机 or OS官方商店 其他非官方app源,安全防护 突破限制

以下&#xff0c;在华为安卓系统手机中&#xff0c;在安装app过程中得到的一些可能是错误的经验。 商品化 app 的收钱方式&#xff1a;通过商店来收钱&#xff0c;通过 app 本身提供的注册码功能来收钱&#xff0c;或是其他的收钱方式。 手机安装 app的特点 从官方商店里安装…

【数据库】Data Model(数据模型)数据模型分析

理解图片中的 Data Model&#xff08;数据模型&#xff09;是学习数据库设计和应用程序开发的重要一步。作为初学者&#xff0c;你可以通过比喻和简单的解释来理解这些概念以及它们之间的联系。以下是对图片中数据模型的详细分析&#xff0c;以及如何理解它们之间的关系。 1. 数…

如何管理需求变更

管理需求变更的关键在于 明确变更流程、跨部门协同、数据驱动反馈。其中&#xff0c;明确变更流程要求在项目初期就建立严格的需求变更流程和审批机制&#xff0c;确保每一次变更都有据可依&#xff1b;跨部门协同强调各部门间紧密沟通&#xff0c;整合多方意见&#xff0c;以避…

每天五分钟深度学习PyTorch:循环神经网络RNN的计算以及维度信息

本文重点 前面我们学习了RNN从何而来,以及它的一些优点,我们也知道了它的模型的大概情况,本文我们将学习它的计算,我们来看一下RNN模型的每一个时间步在计算什么? RNN的计算 ht-1是上一时刻的输出,xt是本时刻的输入,然后二者共同计算得到了ht,然后yt通过ht计算得到,…

JSP+Servlet实现对数据库增删改查之进阶mvc架构

1.Bean层&#xff08;Model层&#xff09;​ 角色&#xff1a;就像餐厅里的“菜品”。​功能&#xff1a;是纯数据对象&#xff08;如Person类&#xff09;&#xff0c;封装属性和 getter/setter&#xff08;例如用户名、密码&#xff09;。​示例&#xff1a;Person类 packa…

多任务学习与持续学习微调:深入探索大型语言模型的性能与适应性

引言 大型语言模型&#xff08;LLMs&#xff09;的出现极大地推动了自然语言处理领域的发展。为了使其在各种特定任务和动态环境中表现出色&#xff0c;微调技术至关重要。本节将深入探讨多任务学习&#xff08;Multi-task Learning, MTL&#xff09;和持续学习&#xff08;Co…

Ubuntu24.04 启动后突然进入tty,无法进入图形界面

问题描述 昨晚在编译 Android AOSP 14 后&#xff0c;进入了登录页面&#xff0c;但出现了无法输入密码的情况&#xff0c;且无法正常关机&#xff0c;只能强制重启。重启后&#xff0c;系统只能进入 TTY 页面&#xff0c;无法进入图形界面。 问题排查 经过初步排查&#x…

图论——广度优先搜索实现

99. 岛屿数量 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。 输入描述 第一行包含两个整数 N, M,表示矩阵的行数和列数。 后续 N 行,每行…

【sql靶场】第13、14、17关-post提交报错注入保姆级教程

目录 【sql靶场】第13、14、17关-post提交报错注入保姆级教程 1.知识回顾 1.报错注入深解 2.报错注入格式 3.使用的函数 4.URL 5.核心组成部分 6.数据编码规范 7.请求方法 2.第十三关 1.测试闭合 2.列数测试 3.测试回显 4.爆出数据库名 5.爆出表名 6.爆出字段 …

[项目]基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信

基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信 一.Si24Ri原理图二.Si24R1芯片手册解读三.驱动函数讲解五.移植2.4g通讯&#xff08;飞控部分&#xff09;六.移植2.4g通讯&#xff08;遥控部分&#xff09;七.通讯模块的完成&#xff08;遥控部分&#xff09; 一.Si24Ri原理图 S…

PyQt6内嵌http.server Web 和Flask Web服务器方法详解

PyQt6 可以内嵌一个简单的 Web 服务器。虽然 PyQt6 本身不提供直接的 Web 服务器功能&#xff0c;但可以结合 Python 的标准库&#xff08;如 http.server&#xff09;或其他 Web 框架&#xff08;如 Flask、FastAPI 等&#xff09;来实现。 示例&#xff1a;使用 http.server…

【源码分析】Nacos实例注册流程分析-事件驱动框架

【踩坑记录】 本人下载的Nacos 服务端版本是2.3.2&#xff0c;在开始进行源码编译便遇到问题&#xff0c;下面是各个问题记录 源码大量爆红 在最开始用Idea加载Maven项目的时候&#xff0c;发现项目中大量的代码爆红&#xff0c;提示其类或者包不存在&#xff0c;后来结果查…

Unity物理射线滤除某层

关键点&#xff1a;使用LayerMask&#xff0c;针对Physics里检测collider的射线&#xff08;raycast、OverlapSphere...&#xff09;都适用 1.使用layerMask过滤层 int ignoreLayer LayerMask.NameToLayer("IgnoreRaycast");// 获取要忽略的层 int layerMask ~(1…

【白话神经网络(二)】矩阵、CNN、RNN

全连接层 回顾前面学过的知识&#xff1a; 一个最简单的神经网络&#xff0c;就是ywxb 套上一个激活函数。 如果有多个输入&#xff0c;那就是多个w和x 如果有多个输出&#xff0c;那就再来一行公式&#xff0c;多一组w和b 要是神经元多了的话&#xff0c;公式密密麻麻的&…

Unity教程(二十二)技能系统 分身技能

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

深入解析Java面向对象三大特征之多态、final、抽象类与接口

面向对象编程&#xff08;OOP&#xff09;的三大核心特征为封装、继承、多态&#xff0c;其中多态是最具灵活性和扩展性的特性。本文将从多态的本质出发&#xff0c;结合final关键字、抽象类与接口的设计&#xff0c;深入探讨这些概念的应用场景及其在代码中的实现细节&#xf…

编码器和解码器概念及算法示例【清晰易懂】

编码器&#xff08;Encoder&#xff09;和解码器&#xff08;Decoder&#xff09;是处理信息的一对“搭档”&#xff0c;它们的作用就像是“翻译员”和“逆翻译员”。 1. 编码器&#xff08;Encoder&#xff09;是什么&#xff1f; &#x1f449; 把原始信息变成另一种形式&a…