项目中发券问题解决

今天添加了一个新表,用于记录发券与订单之前的关系,重要的是记录了发卡的卡号,通过这种方式很快就找到了困绕很久的问题,就是发券经常失败。下面细细分析一下原因。

由于使用队列进行发券,在高峰时间段,就会出现多进程同时发券的情况,我之前的思路是有数据库中,有一个可用券池,每次发券时,从可用券池中取一张可用券,那么问题来了,如果两个队列进程同时取券,就会取到同一张券,通过下面代码更直观看出来:
Coupon::where('certistatus', 2)->where('cardhyno', null)->first(['certino', 'checkcode', 'cardhyno', 'certiname'])

因为代码中每次取第一张可用券,多线程同时取券时,就取到同一张券,这种情况下,券只会绑定给一个用户,另一个用户就绑券失败。

解决办法是,不使用券池,改成每次根据规则,直接生成新券,因为使用队列操作,带来的数据写入负担可以接受。本身不是什么大问题,但因为多线程开发,就忽略了任务同时执行带来意想不到的问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,394评论 11 349
  • 1. 基础知识 1.1、 基本概念、 功能 冯诺伊曼体系结构1、计算机处理的数据和指令一律用二进制数表示2、顺序执...
    yunpiao阅读 5,471评论 1 22
  • 金桂飘香,我们迎来了硕果累累的收获季;秋风送爽,我们盼来了莘莘学子的开学季。沐浴晨光,点燃了新升的希望;再起...
    秀以阅读 634评论 0 5
  • 年年_DK阅读 256评论 0 0