A和B接口同时修改table字段,无法确认调用顺序

2022-02-23 20:10:13 浏览数 (1)

先描述下问题原因,我先文字描述,再画了个流程图。

描述

AB两个接口更新同一个表的字段,但是以B接口下发数据为准,上游调用A接口的同时调用C接口,C接口再同时调用B接口,理论情况下更新时间是按着A先插入了tabel的字段,B再进行更新,最终数据是以B接口下发数据为准的,但由于A接口下发业务逻辑复杂,导致短时间A接口未提交事务时B接口被调用就进行了更新并提交事务导致A接口的事务提交覆盖了B操作,但更可怕的就是A还未提交事务,表中无数据可更新,B无法更新的情况如何更新数据?目前方案在B接口调用时放入缓存数据,在A接口被调用时缓存中有数据则更新缓存中的数据,没有则表明此时B还未被调用则不更新,常规的发生异常或者B后提交事务可以解决,但是A未提交事务时,B无法更新的情况如何处理?

然后说下场景:order服务统一下发数据,异步调用RPCa和RPCc,order服务不关心AC是否调用成功,A调用失败也不会回滚C,C同理。A插入数据,B根据条件更新table中的某些数据。

问题

  1. A事务还未提交时,B被调用,B无法更新数据
  2. A下发数据异常导致B无法更新数据
  3. 在什么节点下删除缓存

是分布式事务吗?

当然不是,AC被调用就是线程隔离的,并且其中一个事务回滚不影响另一个事务。

思路

  1. A就不需要insert所需数据,调整字段类型为null,当B被调用时更新。但是既然无法保证调用顺序,作废
  2. 是否能够保证B永远在A被调用后执行?不能
  3. 在B被调用就放入缓存,然后Ainsert的时候取缓存的值,缓存有数据ok,没数据不更新,在A insert提交事务后再次触发判断缓存是否有数据,有更新,无的话就说明B还未被调用,B正常去更新就好了,这样只要B成功调用不管是否更新,A被调用时提交事务前后都能更新数据,如果A提交了事务缓存都没值,B也能顺利更新,即便A事务发生回滚再次被调用时也会更新成正确数据。代码比较简单就不上了。

4.能不能当B被调用时先查询是否有数据,没有的话先阻塞,等A提交事务后再被唤醒?可能不行,因为接口肯定调用就超时了。

5.删除缓存节点的话,等业务流程关闭的时候进行删除就可以了。

0 人点赞