首页 > 其他分享 >本地事务失效问题描述及其解决方案

本地事务失效问题描述及其解决方案

时间:2023-05-17 22:13:18浏览次数:30  
标签:事务 调用 服务 解决方案 回滚 本地 失效

什么情况下会出现本地事务失效的问题,为什么会出现本地事务失效问题?
 
在分布式架构中,本地事务失效的原因主要是在于分布式事务的实现难度和复杂度,需要在多个服务之间进行协调、通信和同步状态等,在特定的情况下,可能会出现延迟,中断或者失败的问题。
 
举一个简单的例子:如果在多个服务之间相互调用的时候,如图:

 
如果在当前情况下,就会出现本地事务失效的问题,因为a服务是调用feign进行远程调用bcd服务,由于b、c服务都成功的完成了相应的任务,都提交了自己的事务,但是,这时候d服务调用失败了,首先,d服务肯定会进行回滚,因为是a服务调用的d服务,a事务当然也会回滚,这是你就会发现出现了矛盾点,如果a服务回滚了,那么bcd都应该回滚呀,这是会就产生数据上的差异。
 
还可能导致本地事务失效的原因有:
1、数据库之间存在级联关系或相互依赖,如果在数据操作过程中不考虑这些关系,就有可能导致业务数据的不一致性。
2、分布式锁的使用不当,如果在执行分布式锁时没有合理地考虑竞争关系,甚至会出现死锁等问题,从而导致本地事务失效。
3、不同的服务可能会采用不同的编程语言和框架,这会使得在服务之间的数据传输和交互过程中产生一些兼容性问题,从而导致本地事务失效。
等。。。
 
 
 
如何解决在分布式情况下的本地事务失效的问题:
其实比较简单,需要清楚的是:同一个对象中事务方法互调事务会默认失效,因为绕过了代理对象,事务是使用代理对象进行控制的
解决方法:
可以存在多种解决方式:
1、通过分布式事务解决本地事务失效的问题,例如使用两阶段提交协议(Two-Phase Commit, 2PC)或者三阶提交协议(Three-Phase Commit, 3PC),这些协议可以保证分布式系统中的事务原子性和一致性,避免本地事务失效导致全局事务的不一致性问题。(注意使用这个方式并发量较低)
2、使用补偿性事务:这个比较容易理解,就是在需要回滚的时候,手动调用我们编写在远程服务中的相反操作实现,可以理解为我们编写了回滚的方法,在需要回滚的时候,我们远程调用我们编写的回滚方法实现回滚。
3、采用幂等性设计:在设计服务接口时,可以采用幂等性设计,即同一个请求可以重试多次,但最终结果应该是一致的。例如,在支付过程中,如果多次提交同一笔订单,系统应该保证只会扣款一次,从而避免数据的不一致性。
4、使用消息队列:将一个复杂的任务拆分为一个一个的小任务,将这些小任务通过消息的方式存入消息队列中,只有当消息队列中的小任务都完成之后,才表示这个复杂的任务完成了,如果小任务失败了,通过事务注解,也可以实现回滚,并且这种方式是通过异步的方式调用,并发量较高

标签:事务,调用,服务,解决方案,回滚,本地,失效
From: https://www.cnblogs.com/just1t/p/17407169.html

相关文章

  • JVM(五)本地方法接口
    JVM(五)本地方法接口和本地方法栈1本地方法一个NativeMethod就是一个Java调用非Java代码的接口。在定义本地方法的时候,不提供实现体标识符native能够和除了abstract的java标识符连用publicclassNativeTest{ publicnativevoidmethod1()throwException; .........
  • Plsql或Navicat连接登陆Oracle时慢、执行语句的时候也特别慢的问题解决方案
    用Plsql或Navicat连接登陆Oracle时,等待时间特别长。经过漫长的等待后,执行语句的时候也特别慢,监听配置没毛病的情况下,大概率是监听日志文件过大导致的。监听日志路径:app\Administrator\diag\tnslsnr\LS--20171012URU\listener\trace\listener.log删除listener.log文件即可。......
  • mysql 调优-索引失效
    范围条件放最后面,不管单列还是多列索引,把能过滤最多的索引放前面用不用索引最终都是优化器决定的,EXPLAINjson格式里的执行成本决定最左匹配,如果是联合索引,查找索引树的时候,只能根据第一个索引才能找到第二个第三个,如果顺序没对就不会走索引--联合索引(name,code,ad......
  • 【.NET】C#/.NET新建项目sln,增加src和test文件夹问题和解决方案
    ​问题介绍    经常逛github找优秀的.NET项目看,看到github上的项目的层级有srctest,sln放在外层。如下图: 发现自己再VisaulStudio新建的项目即使添加了src和test,然后基于文件夹下新建项目,物理路径上也不是这样的结构。如图 物理路径下依然和sln是平级状态。解......
  • GPT大语言模型Alpaca-lora本地化部署实践【大语言模型实践一】
    模型介绍Alpaca模型是斯坦福大学研发的LLM(LargeLanguageModel,大语言)开源模型,是一个在52K指令上从LLaMA7B(Meta公司开源的7B)模型微调而来,具有70亿的模型参数(模型参数越大,模型的推理能力越强,当然随之训练模型的成本也就越高)。LoRA,英文全称Low-RankAdaptationofLargeLanguage......
  • 【git】报错解决方案-'pre -commit hook failed (add --no-verify to bypass)'
    git-commit报错: 可以看到这个报错有两点,第一点是因为npm缓存问题,第二点是pre-commit导致的commit报错pre-commit钩子都被存储在Git目录下的hooks子目录中。当你用gitinit初始化一个新版本库时,Git默认会在这个目录中放置一些示例脚本。这些脚本除了本身可以被......
  • 【git】报错解决方案-'This is probably not a problem with npm. There is likely ad
    git-commit报错: 原因:npm缓存造成的解决方案: 删除packpackage-lock.json,删除所有依赖,执行npmcacheclean--forcenpminstall......
  • 本地事务&分布式事务
    一、本地事务1、事务的基本性质数据库事务的几个特性:原子性(Atomicity)、一致性(Consistency)、隔离性或独立性(Isolation)和持久性(Durabilily),简称就是ACID。原子性:一系列的操作整体不可拆分,要么同时成功,要么同时失败一致性:数据在事务的前后,业务整体一致。隔离性:......
  • 向日葵等工具,远程连接电脑时,Visual Studio黑屏或白屏解决方案
    原因:向日葵等软件,和VS的GPU渲染有冲突,导致不能正常显示。解决方案:取消VisualStudio的GPU渲染功能。操作步骤如下:方式一:如果能直接操作远程电脑,直接打开远程电脑的配置,取消GPU的渲染。取消下面两项的勾选状态,点击确定按钮,远程时可正常显示。 方式二:当前操作不了电脑,只......
  • MYSQL因IN的范围太大导致索引失效问题
    背景最近发现有个用于统计的门店串码激活数量的SQL特别慢,将其摘出来大致如下SELECTa.sku_idasskuId,a.store_idasstoreId,count(*)assaleQtyFROMall_imei_infoawherea.activated_time>=1675530000000anda.activated_time<=1675616399999anda.stor......