问题遇到的现象和发生背景
A方法执行数据库操作,异步调用B方法去把数据更新到es中,如果此时es报错,A方法执行的数据库操作不会回滚,这个怎么解决,或者有其他的方法可以异步操作吗
问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
B方法报错时,A方法执行的数据库操作能回滚
A方法执行数据库操作,异步调用B方法去把数据更新到es中,如果此时es报错,A方法执行的数据库操作不会回滚,这个怎么解决,或者有其他的方法可以异步操作吗
B方法报错时,A方法执行的数据库操作能回滚
首先你这是两个独立的逻辑,关联点就是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方法。