首页 新闻 会员 周边 捐助

接口设计读和写得问题

0
[待解决问题]

接口设计

1、接口一:查询A表状态 ,已提交则返回
2、接口二:改A表状态为已提交

这个时候接口二和接口一同时触发,由于接口二比较耗时,会出现接口一快接口二,从而出现异常插入的数据,如何才能避免这种情况的发生

cker90的主页 cker90 | 菜鸟二级 | 园豆:258
提问于:2022-04-12 14:29
< >
分享
所有回答(4)
0

同时访问两个接口。一接口不是返回了未提交状态?怎么出现异常插入数据

小鸣Cycling | 园豆:350 (菜鸟二级) | 2022-04-12 20:39

接口返回未提交,但是实际上这个时候已经在做接口二操作了,这样就会影响接口一的正常操作

支持(0) 反对(0) cker90 | 园豆:258 (菜鸟二级) | 2022-04-14 13:59

@cker90: 你伴随接口1的状态读取的插入数据的判定是什么?接口2的活还没干完之前,接口1再快读到的也是更改之前的状态吧

支持(0) 反对(0) xsz1234 | 园豆:39 (初学一级) | 2022-07-20 18:53
0

接口二在修改状态前,先要查询判断一下状态是否满足修改条件,同时在修改状态sql,增加where 状态<>已提交,根据受影响行数,如果为0,说明发生了并发冲突,此时可以让接口二的逻辑重试,重试时会判断出状态不满足修改条件,返回相应提示

izan | 园豆:205 (菜鸟二级) | 2022-04-14 08:46

具体怎么操作呢

支持(0) 反对(0) cker90 | 园豆:258 (菜鸟二级) | 2022-04-14 14:12

@cker90: 哪个环节你不会呢,重试?你也可以不重试,直接返回接口二执行失败,原因是发生了并发冲突

支持(0) 反对(0) izan | 园豆:205 (菜鸟二级) | 2022-04-14 14:16

@izan: 不是接口本身并发,是接口一和接口二的触发时间一样,导致的数据不准确

支持(0) 反对(0) cker90 | 园豆:258 (菜鸟二级) | 2022-04-14 14:57

@cker90: 一个道理呀,这也是并发问题呀,你接口二作为数据修改方,需要做好控制,接口一只是查询,允许查询得到结果后数据发生变化呀,接口二你在更新状态时,加一个where 状态<>已提交,那么假设此时状态已经是提交状态了,那么一定不会有更新成功的数据呀,也就是受影响行数是0,那就知道状态已经被变掉了,而且你描述的问题也有点奇怪,为啥接口一是查询数据,接口二是修改数据,而却出现异常插入数据问题

支持(0) 反对(0) izan | 园豆:205 (菜鸟二级) | 2022-04-14 15:10

@izan: 可能是我描述有问题,不是你说的这个情况哈,是插入前回去判断这个是否已提交,已提交就不再插入,目前就是接口二还没执行完,接口一又插入数据了,导致数据不准确

支持(0) 反对(0) cker90 | 园豆:258 (菜鸟二级) | 2022-04-14 16:04

@cker90: 有几个办法:
方案一:
接口一在插入数据的时候,采用IF NOT EXISTS INSERT INTO 的方式,判断受影响行数(这种方式我不太确定是否可以,对数据库这块研究不够深入,或者可以在查询状态的时候将表锁住),同时接口二update的时候,也还是要加where 状态<>已提交,判断受影响行数

方案二,加锁,性能会差一些:
1.如果你这两个接口只会发布在一台服务器,不会部署多个服务,那么你可以利用lock加锁,控制在操作表A的时候,只能有一个接口在操作
2.如果你这两个接口会部署多次,那么可以利用Redis做分布式锁,控制操作A表时,只会有一个接口在执行

支持(0) 反对(0) izan | 园豆:205 (菜鸟二级) | 2022-04-14 16:15
0

加锁 接口2提前锁定资源

labman004 | 园豆:214 (菜鸟二级) | 2022-05-12 17:09
0

接口二是多余的,接口1的插入和状态更新直接用事务,保证一次执行成功

二次元攻城狮 | 园豆:462 (菜鸟二级) | 2023-07-25 20:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册