liyunzheng120 2022-01-07 22:09 采纳率: 42.9%
浏览 378
已结题

从第三方API获取信息,获取成功扣除余额1,实际执行余额扣除混乱

代码如下,正确结果应该是每获取到一个有效信息(即code==0时),用户wang余额扣除一个点,实际执行效果扣除余额不准确,获取到一次有效信息会出现扣除用户两个点或者三个点的情况。用户访问频率较高,一秒可能会访问接口3到4次。我能想到的可能是由于没有加timeout,访问原始API时信息还没有及时返回,用户又进行了下一次访问,导致扣除余额混乱。来先生指教,谢谢!
headers = {'Connection': 'close'}
src_codeurl = 'http://api.kkjkj.cn/getmsg?token=544548748455'' #原始API
                    print(src_codeurl)
                    try:
                        reponse = requests.get(src_codeurl, headers=headers, verify=False)  # 访问原始API
                    except requests.exceptions.Timeout as e:
                        result = {'code': 3, 'message': ''}
                    except requests.exceptions.ConnectionError as e:
                        result = {'code': 3, 'message': ''}
                    else:
                        result = json.loads(reponse.text)  # 解析返回json
                        print(result)
                        code = result.get('code')  # 获取code值,code值为0时说明取到有效信息
                        if code == 0:
                            sql = "update scmsg set yue=yue-1 where user =wang" #成功获取到信息,扣除用户wang相应余额
                            with db_lock:
                                db.is_connected()
                                db.cursor.execute(sql)
                            msg = result['msg']  # 获取有效信息内容
                            result = {'code': 0, 'msg': 'succ', 'Vmsg': msg}#自定义的返回格式


  • 写回答

20条回答 默认 最新

  • 张音乐 博客专家认证 2022-01-11 14:36
    关注

    不应该直接修改数据库,正确的思路应该是下面这样,加锁方案不太靠谱,因为会造成数据丢失,例如,我有两次code=0,但是只保证执行了一次yue=yue-1
    1.创建一个全局队列(如果是分布式,可以用 redis 或者 rocketMQ, mysql等来实现队列, 消息消费后删除),如果是单机,则使用本地队列,例如先进先出队列。
    2.code == 0 时 ,写一个 存根 例如(user = wang, yue = 1) 到消息队列。
    3.先进先出,或者定时任务 一条条消费存根数据。
    4.根据存根消息 update scmsg set yue=yue-1 where user = wang
    如果给您提供思路了,望采纳。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(19条)

报告相同问题?

问题事件

  • 系统已结题 1月22日
  • 已采纳回答 1月14日
  • 创建了问题 1月7日

悬赏问题

  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥20 java在应用程序里获取不到扬声器设备