前言
在上一篇,通过实例演示了在高并发场景下多人抢购优惠券的超卖问题,并且利用redis+lua解决了超卖问题,但是一人只能抢一单的问题是否还在呢?
一人抢多单压测
可以发现,在经过改造时候,虽然解决了超卖问题,但是一人可以抢购多单的问题仍然存在
为什么会存在这个问题呢?简单分析下面这段代码,扣减库存和下单操作分割为2步,在多线程并发抢购时,第二步判断用户是否抢过和下面的第三步,第四步都是隔开的,
假设多个线程都走到第二步,这时候发现当前1111这个用户还没有抢过,继续走到第二步时候,当库存不为0时,从这一步到下单这一步,又是两个不同的步骤,因此多个线程存在交叉的情况,于是就出现了一人抢多单的情况