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

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

欢迎订阅关注公众号:赵KK日常技术记录
先描述下问题原因,我先文字描述,再画了个流程图。

描述

AB两个接口更新同一个表的字段,但是以B接口下发数据为准,上游调用A接口的同时调用C接口,C接口再同时调用B接口,理论情况下更新时间是按着A先插入了tabel的字段,B再进行更新,最终数据是以B接口下发数据为准的,但由于A接口下发业务逻辑复杂,导致短时间A接口未提交事务时B接口被调用就进行了更新并提交事务导致A接口的事务提交覆盖了B操作,但更可怕的就是A还未提交事务,表中无数据可更新,B无法更新的情况如何更新数据?目前方案在B接口调用时放入缓存数据,在A接口被调用时缓存中有数据则更新缓存中的数据,没有则表明此时B还未被调用则不更新,常规的发生异常或者B后提交事务可以解决,但是A未提交事务时,B无法更新的情况如何处理?
image.png
然后说下场景:order服务统一下发数据,异步调用RPCa和RPCc,order服务不关心AC是否调用成功,A调用失败也不会回滚C,C同理。A插入数据,B根据条件更新table中的某些数据。

问题

A事务还未提交时,B被调用,B无法更新数据

A下发数据异常导致B无法更新数据

在什么节点下删除缓存

是分布式事务吗?

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

思路

A就不需要insert所需数据,调整字段类型为null,当B被调用时更新。但是既然无法保证调用顺序,作废

是否能够保证B永远在A被调用后执行?不能

在B被调用就放入缓存,然后Ainsert的时候取缓存的值,缓存有数据ok,没数据不更新,在A insert提交事务后再次触发判断缓存是否有数据,有更新,无的话就说明B还未被调用,B正常去更新就好了,这样只要B成功调用不管是否更新,A被调用时提交事务前后都能更新数据,如果A提交了事务缓存都没值,B也能顺利更新,即便A事务发生回滚再次被调用时也会更新成正确数据。代码比较简单就不上了。

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

5.删除缓存节点的话,等业务流程关闭的时候进行删除就可以了。
目录
相关文章
|
缓存 测试技术
podam mock 对象部分字段没有赋值问题
本文主要分析使用 podam mock 对象时,部分字段无法自动赋值的原因,并给出解决方案。
|
7月前
|
Python
定义字段
定义字段。
31 1
|
消息中间件 缓存 数据库
A和B接口同时修改table字段,无法确认调用顺序
在互联网应用开发中,经常会碰到多个接口同时需要修改数据库表字段的情况。然而,由于无法确认接口调用的顺序,可能会导致数据冲突和一致性问题。本文将介绍一种解决这一问题的方法,通过合理的设计和技术手段,确保同时修改table字段的操作能够顺利进行,数据一致性得到保障。
156 0
A和B接口同时修改table字段,无法确认调用顺序
|
XML Java 数据格式
【Lua基础 第4章】Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
151 0
【Lua基础 第4章】Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
|
存储 Java 编译器
JVM14_Class文件结构细节、魔数、Class文件版本、常量池、访问标识(或标志)、类索引|父类索引|接口索引集合、字段|方法|属性表集合(二)
③. 如何确保高版本的JVM可执行低版本的class文件? ④. 常量池(class文件的基石) ①. 什么是常量池? ②. 常量池计数器 ③. 常量池表
132 0
JVM14_Class文件结构细节、魔数、Class文件版本、常量池、访问标识(或标志)、类索引|父类索引|接口索引集合、字段|方法|属性表集合(二)
|
存储 Java 索引
Class文件结构介绍[访问标志,类索引,父类索引,接口索引集合]
在常量池结束后,紧接着的两个字节代表访问标志(access_flags),这个标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口,是否定义为public类型,是否定义为abstract类型,如果是类的话是否被声明为final等,
Class文件结构介绍[访问标志,类索引,父类索引,接口索引集合]
基类、接口的应用——表单控件:一次添加、修改一条记录,一次修改多条记录。(上)
好久没发帖子了,又加了不少的功能呀。(图片仅是测试,不代表什么表情。) 本来我也想写一个2007的总结的,但是看到很多人都写了,我就不凑热闹了,写点和代码有关系的吧。 写作原因: 1、在项目里做得最多的操作恐怕就是保存数据了,总是要写一大堆的代码,能不能简单一点呢?2005来了,似乎可以减少一些代码,但是03里怎么办呢? 2、基类、接口、策略模式,好多高手都讨论过了,但是都是理论上的,在实践中如何应用呢?在webform 里面又怎么使用呢? 目的: 1、做一个“控件”来应对各种表单的录入,包括一次保存一条记录、一次保存多条记录。
1021 0
接口中带参方法,传入IB类型的数据
不同的接口有不同的方法 不同的类有不同的作用 不同的作用产生不一样的效果 不同的效果让程序看似复杂,实际简单... 比如此程序,看似复杂,实际就那么点事: 谁生成了谁,谁设置了谁,谁传入了谁,谁被谁调用,谁被谁输出. 如果还是不明白,好记一些就是这个程序之中有两个接口,两个类,四个方法...它们通过创建方法,设置方法的参数值, 有的方法通过其它的对象进行了调用,有的则通过了调用者本身(this),最后随着最后的大括号结束,程序结束了. 世界再次恢复了平静.将编程看作是一门艺术,而不单单是个技术。
1068 0