高并发场景下如何保证商品不超卖?
1.3k
等5人参与

什么场景会导致超卖?
有两种情况可能会导致卖超:
(1)一个用户同时发出了多个请求,如果库存足够,没加限制,用户就可以下多个订单,比如:如果是先查询用户有没有下单,没有再插入,这样就会有问题,因为两个操作并不是原子操作。
(2)多个用户并发减库存,也可能会导致把库存减成负数,假如程序是先查询库存够不够,再去减库存就会出现这样的问题,因为两个操作并不是原子操作。当然可以使用select for update对数据加锁,但是,加锁会严重影响并发,并不推荐。
我们的解决办法:
对于(1):
前端加验证码,防止用户同时发出多个请求,常见的比如:给出4个汉字让输入汉字首字母的拼音,验证码的逻辑一定不能提前让用户知道,这样还可以拉长用户的输入时间,降低秒杀开始时候的瞬间并发度。
隐藏秒杀页面地址,防止用户提前抓取网页,分析出接口,写出刷接口的脚本机器人。可以通过管理后台做配置,活动开始的时候展示真正的秒杀页面。
在后端的miaosha_order表中,对user_id和goods_id加唯一索引,确保一个用户对一个商品绝对不会生成两个订单。
对于(2):
我们在减库存的sql上添加对库存数量的判断,类似于是一个乐观锁,如下:
图片描述
这样只需要判断返回结果是否大于0就可以判断是否扣减库存成功。

我的作业
去发布

登录后即可发布作业,立即

全部作业

数据加载中...

意见反馈 帮助中心 APP下载
官方微信