分布式事务之远程调用服务异常后的事务回滚

七、回滚机制——事务回滚 在 Spring Boot 和 Spring Cloud 中实现事务回滚,可以根据系统的复杂性选择合适的事务管理策略。对于单库事务,使用 Spring 的注解即可实现事务管理和回滚。对于分布式事务,可以选择使用两阶段提交(2PC)、三阶段提交(3PC)、TCC 模式或 Sagas 模式等方法来保证事务的一致性和完整性。 阅读详情

前言


在这里插入图片描述

 同一个商品在很多仓库都有库存 库存-锁定是剩余的商品数量

下了一个订单 里面有多件商品 要分别找每个商品是否还有库存
在一个订单下的多个商品只要有一个是没有库存的 整个订单就要回滚

在这里插入图片描述

在这里插入图片描述

 写Sql语句的时候 先不用找到具体的字段关系 可以先用数字来代替 然后在数据库哪里好使了就焕

 在这里插入图片描述

 抛异常来判断返回的值是什么 而不是用 if else来判断

在这里插入图片描述

在这里插入图片描述

1. 分布式事务

异常回滚在同一个服务器中很简单
如果在一个逻辑下包含本服务自身事务异常回滚+远程服务器里的事务异常回滚
就涉及到分布式异常
在分布式事务中
A1
B
A2

上面的逻辑就涉及远程调用B服务器的事务异常逻辑
两个情况:
情况一:A无异常 数据库正常操作 B因为远程调用返回给A的是操作失败
A以为B事务异常 所以A操作数据库逻辑回滚 数据库无变动
但其实B只是 因为远程操作时长过长导致失败 网络抖动等都是原因 B已经在数据库里做了操作 数据库记录已经变化

情况二:
A2出现异常 抛出异常 希望 A1和 B都事务回滚 数据库操作
A1还好说因为都在同一段代码里 可以直接回滚 但是B无法直接回滚 因为B在另一个服务器里 除非我们调用B 否则无法回滚 因为事务是一个链接

在这里插入图片描述

在这里插入图片描述

 不要求强一致 远程的库存扣了就扣了 无法立即在同一时间回滚 但是可以等一会慢慢的 最终一致 远程库存回滚把减了的库存再加回来就行 不用此时事务同时回滚

 一两个系统不可用 为了保证稳定性 我们会将部分客户转到降级页面 (当前页面不可用)

2. 分布式事务的解决方案

1)刚性事务 ACID 强一致 的2PC

有一个中间管理资源 问每一微服务的本地事务 是否准备好了
当每一个微服务的本地事务都回复准备好了 才开始提交事务

一旦中间管理资源 发现有那个本地食物没提交成功 就全部回滚
这就是强一致性 详细管理所有 并且锁定所有

2)柔性事务 BASE 最终一致性

本地服务保存订单 远程锁库存 本地服务扣积分
最终一致性就保证远程的服务 本来加了200 为了模拟事务回滚 就在代码里检测到异常后-200 达成回滚的效果

try{
    调用远程服务操作接口获得准备数据
}confirm{
   确认提交 真的操作数据
}
catch{
  发现整个流程其他阶段报异常,模拟事务回滚  
  调用远程服务操作接口 【把刚才的操作如果是+ 现在就-  恢复原样】
}

2.1 springcloud alibaba seata 解决分布式事务

既然事务是一个与数据库的链接
如果想要用seta 去控制分布式事务问题
seta势必要管理好 各服务与数据库的链接 核心 管理好数据源 datasource

seta 的管理就是包装 数据源 将数据源包装过后再使用
下面不适用SpringBoot 2.0 因为已经循环依赖bean

在这里插入图片描述

 但意思就是 上面与配置文件关联的这个duriddatasource 以参数的形式传进 下面的@PRIMARY 以该bean为主的 方法里 通过代理包装原本的数据源 是seta代理过后的数据源成为主数据源

在这里插入图片描述

 datasourceAutoConfiguration 是 spring 里的 数据源配置类
里面还维护了其他配置类
配置类中注入了很多数据源 hrika就是spring默认的数据源
上面的注解的意思是 如果我们自己没有配数据源 就会默认走这个数据源

我们可以模仿上面的createDataSource也写一个配置类 注入到容器里 我们自己配数据源 就不会走到上面那个默认的数据源了
这样就能全面的防御和使用 达到分布式事务的目的

但是seta 的 核心 是获得全局锁 就是对所有的事务【即与数据库的链接】串行化操作 此时此刻要把这个请求所到的微服务与数据库的链接锁住 等到整个大业务没问题释放锁
但是全局的锁住事务 就无法达到并发 此时若再有其他请求过来也需要这个数据库的链接 就要等待
所以这个分布式事务的内核是一个串行化 请求需要等待上一个请求的事务释放链接

2. 柔性事务-最大努力通知型-支持大并发

上面的代码也还是在用try去感知 在本地去通知 和 回滚
有没有什么工具可以借助 让这个工具去分发 通知 并且不用写同步代码 现在要感知异常后等待所有事务回滚才结束
MQ 在这个大流程里 如果三个业务有一个失败了 可以发送到MQ里 其他两个业务监听TOPIC发现这个业务失败了 要回滚 就消费消息 执行回滚catch代码 支持并发 有一个失败了 其他两个回滚是异步的 不像上面的手写代码 要等待同步

3. 存在的问题

如果在本地事务中调用远程服务,那样本地该事务的操作就与提供远程服务的接口强依赖了,如果远程服务出现了问题,那么就会拖长事务,事务长时间没有提交,数据库连接就不会被释放,随着太多的数据库连接被占用,可能会导致数据库崩溃。

分布式事务处理方案 1.分布式服务的发展概况 CAP  首先了解下分布式服务的基本概念-CAP, CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得 一致性: 更新操作成功并返回客户端完成后,分布式的所有节点在同一时间的数据完全一致,本文讲的分布式系统事务一致性就是典型的一... 阅读详情

相关推荐

在 PostgreSQL 里如何实现数据的分布式事务的回滚和补偿机制?

在分布式系统中,一个事务可能会涉及到多个节点上的数据操作。分布式事务的目的是确保这些跨节点的操作要么全部成功,要么全部失败,以保持数据的一致性。打个比方,这就好比一个团队合作完成一个项目,如果其中一个环节出了问题,整个项目都可能受到影响,所以需要确保每个环节都能顺利完成,或者在出现问题时能够及时回滚,避免造成不良后果。分布式事务的回滚和补偿机制是保证分布式系统数据一致性的重要手段。在 PostgreSQL 中,我们可以通过两阶段提交协议来实现分布式事务的回滚,通过执行一些反向操作来实现分布式事务的补偿。

技术笔记 1412

分布式事务解决方案

分布式事务产生的背景 跨库事务:一个本地事务,涉及多个库实例的处理 分库分表:分库之后,导致一个SQL被映射到多个库去执行 微服务化:一个本地事务,设计到多个跨服务的远程调用 DTP事务模型: X/Open DTP(X/Open Distributed Transaction Processing Reference Model) 是X/Open 这个组织定义的一套分布式事务的标准,也就是了定义了规范和API接口,由厂商进行具体的实现。有以下三个角色组成: AP:Application,我们的应用程序

臭臭猫 2058

微服务架构设计原理与实战:如何进行微服务的回滚

1.背景介绍 为什么需要微服务的回滚? 在企业级应用开发中,由于业务快速发展,需求变更频繁,软件的复杂度不断提升,单体架构模式已无法满足应用的快速迭代和部署要求,因此,需要采用分布式、面向服务的架构模式来实现可靠、高效的业务开发。但是随之而来的一个问题就是,当应用出现故障时,如何及时的恢复应用,使其

AI天才研究院 1082

分布式事务解决方案小结

分布式事务解决方案小结

qq_38517570的博客 1298

分布式事务Seata源码解析12:全局事务执行流程之全局事务回滚

1、@GlobalTransactional中配置异常回滚类型rollbackFor、异常不回滚类型noRollbackFor的原理? 2、全局事务执行流程之全局事务回滚流程? 3、seata RM如何根据undo log内容构建回滚SQL,回滚分支事务?

健身变秃,coding变强 4409

实战指南:在华为防火墙上构建基于自签CA的SSL证书挑战式认证体系

本文详细介绍了在华为防火墙上构建基于自签CA的SSL证书挑战式认证体系的实战指南。通过自签CA证书生成、华为防火墙SSL VPN配置、客户端安装与测试等步骤,帮助企业实现更安全的远程办公接入方案,有效防范密码泄露风险。文章重点讲解了证书挑战登录的实现原理和配置细节,适用于企业网络安全建设。

weixin_32428571的博客 257

分布式事务+远程调用服务异常事务回滚

同一个商品在很多仓库都有库存 库存-锁定是剩余的商品数量 下了一个订单 里面有多件商品 要分别找每个商品是否还有库存没有 在一个订单下的多个商品只要有一个是没有库存的 整个订单就要回滚 写Sql语句的时候 先不用找到具体的字段关系 可以先用数字来代替 然后在数据库哪里好使了就焕 抛异常来判断返回的值是什么 而不是用 if else来判断 分布式事务 异常回滚在同一个服务器中很简单 如果在一个逻辑下包含本服务自身事务异常回滚+远程服务器里的事务异常回滚 就涉及到分布式异常 在分布式事务中 A1 .

ss123mlk的博客 3739

实用电路精讲系列---双级运放放大电路(差分放大+跟随缓冲)

本文分析了双极运放放大电路的工作原理及其典型应用。该电路结合差分放大器和跟随缓冲器,实现高精度信号放大与阻抗匹配。差分放大器通过放大差模信号并抑制共模噪声提升信噪比;跟随缓冲器则提供阻抗变换,确保信号稳定传输。两者协同工作可优化输入阻抗、增强噪声抑制并提高设计灵活性。文章还列举了10个典型应用案例,包括医疗设备、工业传感器和新能源系统等,展示了该电路在精密电子系统中的关键作用。最后通过实用电路分析,详细说明了各模块功能及设计注意事项。

weixin_40590799的博客 2961

全局异常处理Seata事务失效解决方案

全局异常处理Seata事务失效解决方案 ​ 最近的项目用到了seata来管理全局事务,在进行测试的时候,发现当service A 调用Service B时,如果ServiceA报错,ServiceB能回滚,但是如果ServiceB报错,ServiceA是无法进行回滚的。 ​ 经过查找,发现是因为当时为了系统能统一处理全局异常,返回统一的异常信息给前端做了一个全局异常拦截,具体代码如下 /** * Controller统一异常处理 * * @author : 777666 * @date : 2022

XX777666的博客 5937

鱼眼相机矫正实战:除了棋盘格,试试横向展开和经纬度法(OpenCV4/C++实现对比)

本文对比了鱼眼相机矫正的三种主流方法:棋盘格标定法、横向展开法和经纬度法,通过OpenCV4/C++实战代码解析,帮助开发者在自动驾驶、VR全景拼接和安防监控等场景中选择最适合的技术方案。重点分析了各方法的精度、处理速度和适用场景,为工程实践提供实用指导。

weixin_29032489的博客 285

基于GPUMD的NEP机器学习势函数—二氧化硅融化

势函数作为分子动力学模拟中最终要的输入之一,其准确性很大程度上决定了模拟结果的可靠性,传统经验势无法很好地描述所有现象,而能进行准确预测的基于第一性原理计算的分子动力学计算量非常大,无法进行大体系长时间的计算。因此最近兴起的机器学习势函数正是解决这一问题的有效工具,它可以通过对第一性原理的计算结果进行学习,通过这个方法得到的势函数具有接近第一性原理的计算精度。这里介绍一种基于GPUMD的NEP机器学习方法。

Rockyoung 5320

Spring Boot:影响事务回滚的几种情况

如果你坚持在 Controller 中处理异常,可以使用。这三个操作需要在同一个事务中执行,任何一步失败都要回滚。

weixin_43833540的博客 548

SAP成本核算的核心逻辑

SAP成本核算采用"计划-归集-分析"闭环管理,以CO模块为核心,集成PP、MM等模块。核算前需配置标准成本控制范围、成本中心等主数据。标准成本通过BOM和工艺路线计算(CK11N),采购和生产过程记录实际成本差异。制造费用通过成本中心归集,作业成本按实际耗用量分配。完工产品按标准成本入库,月末通过KO88结算工单差异,物料分类账(CKMLCP)还原实际成本。整个流程实现FI与CO数据同步,确保账务一致。关键事务码包括CK11N(成本估算)、MIGO(物料移动)、CO11N(报工)等。

金牌架构师 540

微服务分布式事务问题示例

前言 本次示例的场景是下订单减库存。 用到了springboot+springcloud+mybatis+mysql。 数据库有订单表和库存表 springboot整合mybatis和mysql的详细讲解可以看此博客 https://blog.youkuaiyun.com/daziyuanazhen/article/details/100822121 创建eurek...

daziyuanazhen的博客 304

【问题解决】Python 异步 asyncio 卡死、协程不执行、任务泄漏,保姆级排错

本文详细分析了Python异步编程中常见的卡死、协程不执行和任务泄漏问题。文章首先列举了这些问题的典型表现,如程序卡住、死锁、任务未启动等。然后深入剖析了各类问题的根源,包括同步阻塞操作、未正确await、资源未清理等。针对这些问题,文章提供了两套解决方案:一是异步编程最佳实践,包括安全协程执行、带超时的执行、任务清理等实用方法;二是死锁检测和预防机制,通过锁管理和等待图分析来避免死锁。文章还包含可直接使用的代码示例,帮助开发者快速定位和解决异步编程中的常见问题。

博客 451

36、R语言中的回归模型与机器学习算法

本文介绍了R语言中多种回归模型和机器学习算法,包括Cox回归模型、数据平滑方法(如样条函数、多项式曲面拟合和核平滑)以及回归树模型等。重点讲解了这些方法的实现函数、参数说明以及实际应用示例,如使用`coxph`进行生存分析、使用`spline`和`smooth.spline`进行数据平滑处理、使用`loess`和`locpoly`进行非参数回归分析,以及使用`rpart`构建和可视化回归树。此外,还涉及了模型评估与优化策略,如数据拆分、交叉验证和树的修剪。通过这些方法,可以更好地处理复杂数据集并提升模型性能

yhn456789的博客 123

【微服务】【Seata】第3章----【实战】服务编写(订单服务、库存服务、账户服务)

当用户下单时,会在订单服务中创建一个订单,然后通过远程调用库存服务来扣减下单商品的库存,再通过远程调用账户服务来扣减用户账户里面的余额,最后在订单服务中修改订单状态为已完成。下面将创建三个 Spring Boot 微服务项目(订单服务、库存服务、账户服务),演示并通过 Seata 实现分布式事务管理。订单-库存-账户3个库下都需要建各自的回滚日志表seata\conf目录下的db_undo_log.sql。这里我们会创建三个服务,一个订单服务,一个库存服务,一个账户服务。3、3个库分别建对应的回滚日志表。

记录生活 892

18-XLINX的XC7A100T的BANK0引脚说明

DXP_0和 DXN_0是纯输入引脚,Xilinx Artix-7 FPGA 内部集成的一个片上监控模数转换器​ 的差分模拟输入对,模数转换器​的模拟信号输入端,将外部的模拟电压​ 采样并转换为内部的数字值,是一个单向的信号采集过程。它是与 VCCADC配对的关键引脚,共同为内部的精密模数转换器提供一个纯净、安静、独立的参考地平面。多FPGA同步配置: 在多FPGA系统中,主FPGA配置完成后,可以拉低从FPGA的 INIT_B使其等待,等所有FPGA都准备好后,再同时释放,实现同步启动。

weixin_44479192的博客 234

SpringBoot分布式事务Seata入门

本文,我们将纯 Spring Boot 应用接入 Seata 来实现分布式事务。

白石的专栏 4765

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

seata1.4.2异常:feign远程调用时,服务提供方全局事务未生效(不回滚)

https://note.youdao.com/s/P9mL0BKi

qq_42154996的博客 3467

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

seata分布式事务(二)搭建一个本地事务环境

Seata分布式事务(二)搭建一个本地事务环境 代码地址:https://gitee.com/zhaojiyuan/seatademo/releases/1.0.0 项目描述: 创建一个包含pa和pb两个模块的项目 然后再pb项目中添加一个接口,接口功能为:向数据库中添加一条数据 然后再pa项目中添加一个接口,接口功能为:向数据库中添加一条数据,然后通过feign组件实现远程调用pb接口,然后手动抛出一个异常 项目演示: 当调用pa接口时候,会先向数据库添加一条数据,然后调用pb接口

zhaojiyuan1024的博客 293

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

使用Seata彻底解决Spring Cloud中的分布式事务问题

使用Seata彻底解决Sp...

SummerGao 411

[分布式事务-TCC] 2. TCC的异常场景及应对机制

文章导航TCC的异常场景幂等处理产生原因应对策略空回滚产生原因应对策略资源悬挂产生原因应对策略三种异常总结幂等空回滚资源悬挂共通点 TCC的异常场景 在分布式系统中,随时随地都需要面对网络超时,网络重发和服务器宕机等问题。所以分布式事务框架作为搭载在分布式系统之上的一个框架型应用也绕不开这些问题。具体而言,有以下常见问题: 幂等处理 空回滚 资源悬挂 这些异常的应对需要TCC框架的支持和解决方...

不忘初心,好好沉淀 1万+

分布式事务(五)Seata AT模式-Spring Cloud微服务添加 AT 分布式事务

文章目录Seata Server - TC全局事务协调器Seata Server 配置registry.conffile.conf启动参数设置启动 Seata Serverorder订单服务添加 Seata AT 事务storage库存服务添加 Seata AT 事务account账户服务添加 Seata AT 事务 Seata Server - TC全局事务协调器 在《分布式事务(三)Seata分布式事务框架-AT模式介绍》 中介绍了 Seata AT 事务原理,介绍了 AT 事务的三个角色:TC(事务

wanght笔记 1万+

springcloud分布式事务回滚失败

springcloud分布式事务回滚失败 1.场景还原 笔者在公司最近的一个项目采用springcloud框架搭建微服务架构,这势必会引发分布式事务处理的思考,目前处理分布式主流方案tcc及消息的最终一致性;今天笔者集成github上较为流行的tx-lcn分布式处理框架,它是基于redis的一种补偿型处理方案 2.实现方案 ①先截图,下载该框架 从github上的starts数量来看,目前还是...

zhouyuwoziji123的博客 8168

远程调用事务问题治好了我的头痛

通过配置FallbackFactory,可以在远程服务调用失败时提供一个替代的实现逻辑,从而避免直接抛出异常。:在分布式事务中,如果Feign调用的服务抛出了异常并触发了降级机制,可能会导致Seata事务无法正常回滚。:在某些情况下,可以通过调整Ribbon的超时时间来避免因网络延迟导致的事务回滚失败。分布式事务确实让我头痛了一回,A系统a方法修改表后远程调用B系统的b方法,却把a方法修改表之前的数据查出来了的,匪夷所思。:一种常见的解决方案是在调用方的服务中开启一个本地事务,并保证该事务的一致性。

m0_68921558的博客 871
上一篇: Git pull报 fatal: Not possible to fast-forward, aborting的解决办法
下一篇: 事务里面http调用的处理办法
慕城南风
慕城南风 新星创作者: 软件测试技术领域 新星创作者: 软件测试技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄17年 14万+粉丝 337原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕城南风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值