同时访问两个接口。一接口不是返回了未提交状态?怎么出现异常插入数据
接口返回未提交,但是实际上这个时候已经在做接口二操作了,这样就会影响接口一的正常操作
@cker90: 你伴随接口1的状态读取的插入数据的判定是什么?接口2的活还没干完之前,接口1再快读到的也是更改之前的状态吧
接口二在修改状态前,先要查询判断一下状态是否满足修改条件,同时在修改状态sql,增加where 状态<>已提交,根据受影响行数,如果为0,说明发生了并发冲突,此时可以让接口二的逻辑重试,重试时会判断出状态不满足修改条件,返回相应提示
具体怎么操作呢
@cker90: 哪个环节你不会呢,重试?你也可以不重试,直接返回接口二执行失败,原因是发生了并发冲突
@izan: 不是接口本身并发,是接口一和接口二的触发时间一样,导致的数据不准确
@cker90: 一个道理呀,这也是并发问题呀,你接口二作为数据修改方,需要做好控制,接口一只是查询,允许查询得到结果后数据发生变化呀,接口二你在更新状态时,加一个where 状态<>已提交,那么假设此时状态已经是提交状态了,那么一定不会有更新成功的数据呀,也就是受影响行数是0,那就知道状态已经被变掉了,而且你描述的问题也有点奇怪,为啥接口一是查询数据,接口二是修改数据,而却出现异常插入数据问题
@izan: 可能是我描述有问题,不是你说的这个情况哈,是插入前回去判断这个是否已提交,已提交就不再插入,目前就是接口二还没执行完,接口一又插入数据了,导致数据不准确
@cker90: 有几个办法:
方案一:
接口一在插入数据的时候,采用IF NOT EXISTS INSERT INTO 的方式,判断受影响行数(这种方式我不太确定是否可以,对数据库这块研究不够深入,或者可以在查询状态的时候将表锁住),同时接口二update的时候,也还是要加where 状态<>已提交,判断受影响行数
方案二,加锁,性能会差一些:
1.如果你这两个接口只会发布在一台服务器,不会部署多个服务,那么你可以利用lock加锁,控制在操作表A的时候,只能有一个接口在操作
2.如果你这两个接口会部署多次,那么可以利用Redis做分布式锁,控制操作A表时,只会有一个接口在执行
加锁 接口2提前锁定资源
接口二是多余的,接口1的插入和状态更新直接用事务,保证一次执行成功