秋风_潇潇 2021-11-25 09:31 采纳率: 0%
浏览 208

异步调用无法回滚的问题

问题遇到的现象和发生背景

A方法执行数据库操作,异步调用B方法去把数据更新到es中,如果此时es报错,A方法执行的数据库操作不会回滚,这个怎么解决,或者有其他的方法可以异步操作吗

问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

B方法报错时,A方法执行的数据库操作能回滚

  • 写回答

3条回答 默认 最新

  • 关注

    首先你这是两个独立的逻辑,关联点就是B方法是被A方法触发的;
    解决你这个问题的方向有两个:
    1、A执行成功,B无论如何都要成功,一次不行就多次;
    2、A执行成功,B如果执行失败就撤回A的操作;
    在我理解一般业务中es实时性要求并不是那么高,所以实际使用中一般采用第一个方向来解决,核心就是异步和重试,A方法将调用B方法的任务抛给mq,B方法来消费mq任务,如果消费不成功可以将任务重新抛给mq并计数,达到重试次数依然不能成功的任务可以落库,然后通过定时任务来补偿落库的任务(如何补偿根据业务来)。
    如果采用第二个方向来解决的话还有两种方式:
    一、可以让AB方法做同步方法,这样B抛异常可以直接让A回滚;
    二、A依然异步调用B方法,在新写一个方法C用途是手动撤销A方法的操作,在B执行失败时主动调用C方法完成撤销A方法。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月25日

悬赏问题

  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥100 解决数据不连续出现问题
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,
  • ¥15 angular项目错误