开发者社区> 问答> 正文

如何防止高并发同时下单同一商品

最近在做抢购系统,但头疼的是,在多用户高并发的情况下经常会库存出现问题。排查到,在同一时间内多用户同时下单导致查询和插入不同步了,而查询中跟插入又有时间差而在高并发的情况下导致库存问题(我的项目大概是这样,首先 for update查出商品信息表,放入全局表里数组里,当用户扣款余额成功后,update商品信息表减去该用户下单的数量。数据库用的mysql,查询商品信息表的时候是加锁过的,但商品信息表数据越来越多的时候查询有时间差,导致高并发的时候在查询商品信息表放进变量数组里的时候,在执行后面的时间差里,其他用户也在下单,导致库存有问题)。现在提问,同一时间内同一个商品防止多用户抢购,也就是说同一秒内在高并发的情况下只能被一个用户下单,目前的思路是排队,阻塞队列。但具体实现思路是怎样或者大牛们是否有更好的方法,且实现思路是怎样,有案例的话最好。实现语言是PHP。请教各位大牛决解方案

展开
收起
蛮大人123 2016-02-21 10:47:33 5793 0
4 条回答
写回答
取消 提交回答
  • 阿里云ping https://ping.gaomeluo.com/aliyun/
    2019-07-17 18:45:47
    赞同 2 展开评论 打赏
  • 采用锁机制。
    2019-07-17 18:45:47
    赞同 展开评论 打赏
  • 查询的库存不重要,实际下单的库存更重要,应对并发可以通过查询库存的缓存,缓存定期刷新就好,可能查询的库存比实际为多,但是只要保证不要超过人数下单就好。这部分下单的库存建议直接扣减数据库,更新的时候加上where 库存>0 为条件,可以避免扣成负数,不满足的扣减会在db层抛错。

    2019-07-17 18:45:47
    赞同 展开评论 打赏
  • 我说我不帅他们就打我,还说我虚伪

    把抢购系统放成两步,第一步为下单(即抢购),下单成功立即减少数量,更新表数据, 第二部为付款,后台写个程序,如果半个小时不付款,自动删除订单,然后增加数量。这样的话,可以避过并发了,如果一步走,时间再短也会有并发的问题

    2019-07-17 18:45:47
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
徐雷-Java为王,互联网高并发架构设计与选型之路6.0 立即下载
Redis 的高并发实战:抢购系统 立即下载
MySQL高并发场景实战 立即下载