项目中发券问题解决

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

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

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

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

你可能感兴趣的:(项目中发券问题解决)