Seata模式

news2024/11/19 23:41:40

爬虫组件分析

  • 目录
    • 概述
      • 需求:
    • 设计思路
    • 实现思路分析
      • 1.一、AT 模式
  • 参考资料和推荐阅读

Survive by day and develop by night.
talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.
happy for hardess to solve denpendies.

目录

在这里插入图片描述

概述

需求:

Seata 的实现

设计思路

5、调试说明,我们在使用@GlobalTransactional注解的时候,seata的控制事务是有时间限制的默认为1分钟,所以在我们debug的时候如果时间过长,seata就默认回滚了,为了方便大家调试,可以修改这个参数。

实现思路分析

1.一、AT 模式

1、对于seata 来说默认开启的就是 AT模式,而且如果你依赖 seata-spring-boot-starter 时,自动代理数据源,无需额外处理
2、对于AT模式在回滚的时候会找到 undo_log 中的前镜像与后镜像,来进行恢复。
但是在恢复的时候,会比较后镜像是否有没有被修改过,即进行数据进行比较,如果有不同,说明数据被当前全局事务之外的动作进行了修改,这个时候AT模式做数据校验的时候,会回滚失败,因为校验不通过,我们也可以通过配置参数关闭这个前后镜像的校验过程,不过这个是非常不建议的,因为,被其他线程修改了导致不能还原现场这种情况,确实还是需要人为去处理的

1、我们使用注解 @GlobalTransactional开启seata的AT模式的事务管理,而且因为是使用的是seata-starter,那这个注解会自动代理AT模式的数据源,具体代码如下,可以看到代码主要分为两部分,第一部分是调用自己order服务的2个表的mapper 插入数据到gxm-300,第二部分是远程调用device的两个mapper来进行插入数据到gxm-301

3、再测试不成功,即传参的时候id不为空,则seata数据全局事务就会生效,2个数据库4张表都没有数据库,说明seata的AT模式生效了,

在端点处停止的时候,我们观察gxm-300数据库和gxm-301数据库,你会发现,4个mapper的插入数据都已经插入到数据库了,并且一个mapper会在对应的undo_log表中插入一条数据,其中会有前置镜像数据和后置镜像数据,以及分支id branch_id

4、 gxm-301 的 undo_log表

4、 gxm-301 的 undo_log表

5、seata 的 branch_table表
全局表的只有一条数据,因为4个mapper是在一个全局事务里面的,只是分了4个分支。

关联关系就是关联关系就是branch_id和 transaction_id,一个 transaction_id 表示一次全局事务的开始

旗下会有多个branch_id分支事务
那么这些表都不会有数据,因为我们的全局事务结束了,保证的当次业务的流程🆗了,即使是失败了,但是帮你回滚了。

1.1.3、AT模式回滚失败,处理1、对于前面的1.1.2节的调试,我这里出现了问题,可能是因为我断点停留时间太长了,会发现相关表有数据,说seata的at模式回滚失败了。接下来我们就要去处理了。
于是我们到对应的数据中找到它的undo_log,可以看到对应的分支id也是和前面的对应的上的,其中rollback_info字段记录的就是前置镜像的数据和后置镜像的数据。
根据上述的json文件内容,直接操作是insert,而device没有插入成功,但是它插入成功了,我们把相关的数据删除即可,后续如果是其他情况,比如update这种,根据前后镜像数据,按照需求处理。

测试seata回滚时,镜像数据被其他事务修改后,无法回滚成功的情况

1、首先大家要了解seata的AT模式流程,官方文档:Seata AT 模式
这种情况,分两种处理方式
而且rm此时会一直尝试,可以看后面的那张图,一直尝试一直失败,控制台一直打印尝试失败的信息。
然后记得seata数据库的相关表的数据也得删除偶,以及对应的undo_log表数据也需要删除。

1、在本地修改的事务上加上@GlobalLock
其中参数 lockRetryTimes 尝试间隔时间,lockRetryTimes尝试次数,说明在多少秒内间隔多少次会不断重试获取全局锁,如果该记录在全局事务中,则会失败.
而TCC则需要我们提供相应的接口,官方也都表明了 Seata TCC 模式,
@LocalTCC

TwoPhaseBusinessAction

@BusinessActionContextParameter 注解可以将参数传递到二阶段(commitMethod/rollbackMethod)的方法,这个也是下面提到的问题,第二阶段获取的参数只能是第一阶段的一开始通过注解定义的参数值,即使你在第一阶段修改,添加,也没法在第二阶段获取到最新的参数值。

3、TCC 参与者需要实现三个方法,分别是一阶段 Try 方法、二阶段 Confirm 方法以及二阶段 Cancel 方法。在 TCC 参与者的接口中需要先加上 @TwoPhaseBusinessAction 注解,并声明这个三个方法,如下所示

@TwoPhaseBusinessAction 注解属性说明:

name :TCC参与者的名称,可自定义,但必须全局唯一。

commitMethod:指定二阶段 Confirm 方法的名称,可自定义。

rollbackMethod:指定二阶段 Cancel 方法的名称,可自定义。

Try:第一个参数类型必须是BusinessActionContext,后续参数的个数和类型可以自定义。

Confirm:有且仅有一个参数,参数类型必须是 BusinessActionContext,后续为相应的参数名(businessActionContext)。

Cancel:有且仅有一个参数,参数类型必须是 BusinessActionContext,后续为相应的参数名(businessActionContext)。

2.2、如何控制异常
在 TCC 模型执行的过程中,还可能会出现各种异常,其中最为常见的有空回滚、幂等、悬挂等。
空回滚指的是在一个分布式事务中,在没有调用参与方的 Try 方法的情况下,TM 驱动二阶段回滚调用了参与方的 Cancel 方法。
在全局事务开启后,参与者 A 分支注册完成之后会执行参与者一阶段 RPC 方法,如果此时参与者 A 所在的机器发生宕机,网络异常,都会造成 RPC 调用失败,即参与者 A 一阶段方法未成功执行,但是此时全局事务已经开启,Seata 必须要推进到终态,在全局事务回滚时会调用参与者 A 的 Cancel 方法,从而造成空回滚.

在全局事务开启后,参与者 A 分支注册完成之后会执行参与者一阶段 RPC 方法,如果此时参与者 A 所在的机器发生宕机,网络异常,都会造成 RPC 调用失败,即参与者 A 一阶段方法未成功执行,但是此时全局事务已经开启,Seata 必须要推进到终态,在全局事务回滚时会调用参与者 A 的 Cancel 方法,从而造成空回滚

在参与者 A 执行完二阶段之后,由于网络抖动或者宕机问题,会造成 TC 收不到参与者 A 执行二阶段的返回结果,TC 会重复发起调用,直到二阶段执行结果成功。
同样的也是在 TCC 事务控制表中增加一个记录状态的字段 status,该字段有 3 个值,分别为:
tried:1
committed:2
rollbacked:3

如何处理悬挂?
二阶段 Cancel 方法

在 TCC 事务控制表记录状态的字段 status 中增加一个状态:

4、代码中可以增加参数useTCCFence = true,开启seata的放悬挂

saga目前提供了基于状态机的方式,而状态机的语言官方也给出了一个可视化的界面 状态机设计器演示地址:http://seata.io/saga_designer/index.html

XA模式:
3、如果项目没有性能的要求我建议使用XA模式,因为,它是强一致性,而AT模式是最总一致性。
空补偿:原服务未执行,补偿服务执行了

在这里插入图片描述

参考资料和推荐阅读

[1].https://blog.csdn.net/qq_38263083/article/details/125203222

欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!~

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

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

相关文章

_4LeetCode代码随想录算法训练营第四天-C++

_4LeetCode代码随想录算法训练营第四天-C 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II 24.两两交换链表中的节点 整体思路 不是简单地交换值,而是交换指针地指向。 终止条件为: cur->next ! nul…

偏微分方程重要的前置知识

现在觉得很dog 开学期末考试正好美赛。无法评论,无法评论。乐淘淘,乐淘淘。期末考试不要延迟,求求了或者不安排在下学期第一周也可以。。。。反正求求了,美赛机会难得当然,如果是偏微分方程的问题的话,其实…

springboot连接Oracle的注意点(数据库信息配置、主键精度问题、OJDBC jar包、Oracle主键自增问题)

开篇废话:(前段时间因为太忙没有坚持写博客,导致很久没有更新,今天终于忙里偷闲写上一篇) 最近做了一个项目,数据库用的是Oracle,由于之前一直用的是MySQL,所以在一些细节配置上不是…

详细教你用NPS搭建内网穿透服务

文章目录 前言一、NPS概述 NPS的原理 二、NPS服务器搭建 1、下载软件2、云服务器配置 2.1、防火墙配置2.2、用WinSCP远程上传服务文件2.3、使用SSH终端安装启动2.4、修改配置文件 三、客户端连接总结 前言 相信大家外出旅游或者出差都是背着轻薄本,如果空闲之余想…

【Dubbo3高级特性】「实战开发」适配日志框架并支持运行时动态切换使用的日志框架开发实战

日志框架适配及运行时管理 本节内容主要是针对于如何在Dubbo中适配日志框架并支持运行时动态切换使用的日志框架,首先前提是需要进行启动我们Dubbo服务的Qos服务,它主要用于作为我们的操作对应的日志切换的功能实现机制 特性说明 日志框架适配&#x…

MATLB|基于matpower优化调度的风力模型预测

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清…

T6300A 网络综合测试仪 以太网数据 千兆以太网测试仪

一款功能强大、便携式、方便使用、价格便宜的高性价比手持式以太网测试仪是企业中网络管理和维护人员的刚需仪器。好的以太网测试仪可以帮助工作人员迅速解决网络不通、网速慢、丢包、延迟等问题。 当今以太网测试仪市场参差不齐,说的功能一个比一个强,…

【轻松掌握C语言】动态内存管理

目录 一、为什么存在动态内存分配 二、动态内存函数 1、malloc函数 (1)函数的用途 (2)函数的使用 2、free函数 (1)函数的用途 (2)函数的使用 3、calloc函数 (1)函数的用途 (2)函数的使用 4、realloc函数 (1)函数的用途 (2)函数的使用 三、常见的动态内存错误 1、对NULL指针的解…

【小f的刷题笔记】(JS)链表 - 单链表的倒数第 k 个节点 LeetCode19 单链表的中点 LeetCode876

【链表】 一、单链表的倒数第 k 个节点: ✔ 要求:只遍历一遍,链表有多长未知 LeetCode19 链接: 19.删除链表的倒数第N个结点 题目: 思路: 因为没有给头结点,我们就先定义一个哑结点&#…

从对称加密和非对称加密讲解HTTP到HTTPS的发展思路

一、传统的HTTP协议 传统的http在进行网络数据传输时,数据信息都是明文的,因此就很容易出现数据在网络的传输过程(中间路由过程)数据被监听或者窃取、替换的危险。因此http是一种不安全的传输协议。 那么就需要对数据进行加密。…

网络编程与通信原理

总感觉这个概念,和研发有点脱节; 一、基础概念 不同设备之间通过网络进行数据传输,并且基于通用的网络协议作为多种设备的兼容标准,称为网络通信; 以C/S架构来看,在一次请求当中,客户端和服务端…

物联网开发笔记(59)- 使用Micropython开发ESP32开发板之控制合宙4g Air724U模块

一、目的 这一节我们学习如何使用我们的ESP32开发板来控制合宙4g Air724U模块。 二、环境 ESP32 合宙4g Air724U模块 Thonny IDE 几根杜邦线 接线方法: 注意连接方式: ESP32的RX2----->4G模块的TX ESP32的TX2----->4G模块的RX 三、介绍 1&…

JSP ssh机房学生上机管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP SSH机房学生上机管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采 用B/S模式开发。开发环境为TOMCA…

SpringBoot 注解方式快速整合Mybatis

序言:使用MyBatis3提供的注解可以逐步取代XML,例如使用Select注解直接编写SQL完成数据查询,使用SelectProvider高级注解还可以编写动态SQL,以应对复杂的业务需求。 一. 基础注解 MyBatis 主要提供了以下CRUD注解: Se…

Spring Cloud Alibaba Nacos Config - - - >@RefreshScope动态获取刷新后的配置内容

初学者不知道有没有这个疑惑:我明明已经在 SpringBoot 应用的 bootstrap.yml 配置文件中,通过 spring.cloud.nacos.config.refresh-enabledtrue 开启配置文件动态刷新了,为什么在 Controller 控制类中使用 Value 注解无法获取到配置文件修改后…

猿如意中的【取色器】效率工具详情介绍

目录 一、工具名称 二、下载安装渠道 2.1 什么是猿如意? 2.2 如何下载猿如意? 2.3 如何在猿如意中下载取色器? 三、取色器介绍 四、软件安装过程 五、软件界面 六、取色器功能特点介绍 七、取色器使用/体验感受 一、工具名称…

Typescript学习(第三弹)

泛型 定义 不预先确定的数据类型,具体的类型在使用的时候才确定,把泛型理解为代表类型的参数 泛型函数 泛型函数类型 泛型接口 引用泛型接口要指定一个类型,否则会报错 或者在泛型接口里指定一个默认类型 泛型类 泛型放在类的后面这样…

项目上线后我是如何通过慢查询和索引让系统快起来的

1、前言 最近对mysql的操作比较多一些,主要是项目上线以后,难免会有一些数据上的问题。开始的时候还主要由后端来处理,后面数据问题确实比较多,于是我就找后端要来服务器的账号密码,连上数据库顺便来看看数据的问题。…

C语言小项目-----员工管理系统

目录 项目要求: 考虑点: 实现过程 所用知识点 最终效果如下: 项目要求: 考虑点: 服务器端用select监听多个客户端,考虑点在于,公司内部的系统管理系统,不会有太多人每天都登陆&a…

【web前端开发】CSS的元素显示模式

前言 元素的显示模式可以更好的帮助我们布局页面,了解元素的显示模式,可以让我们布局页面时更加简单清晰 什么是元素显示模式 元素显示模式就是元素(标签)以什么样的方式进行显示 HTML元素一般分为块元素和行内元素两种类型 以下是块级元素和行内元素在网页中的显示: 块元…