秒杀系统是如何防止超卖的
场景:
1.电商抢购限量商品,火车票抢座等
秒杀系统抽象来说就是:
1.用户选定商品下单
2.校验库存
3.扣库存
4.创建用户订单
5.用户支付
若项目流量非常小,完全就不用担心有并发的购买请求,所以做秒杀系统意义不大
若项目流量非常大,则要保证在用户流量高峰期不会被搞挂了
严格防止超卖
防止黑产:防止不怀好意的人群通过各种技术手段薅羊毛
保证用户体验:在高并发下,别网页打不开了,支付不成功了,购物车进不去了,地址改不了了。这个问题非常之大,涉及到各种技术,也不是一下子就能讲完的,甚至根本就没法讲完
我们先从“防止超卖”开始吧
毕竟,你网页可以卡住,最多是大家没参与到活动,上网口吐芬芳,骂你一波。但是你要是卖多了,本该拿到商品的用户可就不乐意了,轻则投诉你,重则找漏洞起诉赔偿。让你吃不了兜着走。
不能再说下去了,我这篇文章可是打着实战文章的名头,为什么我老是要讲废话啊啊啊啊啊啊。
上代码。
说好的做“简易”的秒杀系统,所以我们只用最简单的SpringBoot项目
避免超卖:更新商品库存的版本号
为了解决上面的超卖问题,我们当然可以在Service层给更新表添加一个事务,这样每个线程更新请求的时候都会先去锁表的这一行(悲观锁),更新完库存后再释放锁。可这样就太慢了,1000个线程可等不及。
我们需要乐观锁。
一个最简单的办法就是,给每个商品库存一个版本号version字段
https://blog.youkuaiyun.com/zhenghongcs/article/details/104958196