PHP库存问题

秒杀这种走reids队列,那日常的商品库存问题,要如何避免超卖。看人家说用行锁,但是比方说我们现在购物车里面20多件商品,是不是开启事物之后对这20件商品都锁定,那如果业务逻辑繁琐的话,到事物提交超过2秒左右,会不会对mysql造成很大压力?

阅读 5k
6 个回答

加入购物车临时占用库存,一定时间后释放(比如15分钟未下单支付,释放库存)
提交订单占用库存
支付成功更新库存

思路大致和楼上的差不多,但是这种 如果有高并发的话 和服务器 架构会有很大的影响,比如 cdn 和负载均衡,如果有问题 ,很容易导致超发

我有一个很好的方案:

先读库查出 SKU的库存,然后在看队列的长度,如果长度大于等于库存,那么肯定是无法下单了,否则就能下单。

加购物车是不会占用库存的。实际下单动作才会去占用库存

超买这种问题,是无法完全避免的,不能仅仅在技术上做超卖问题的限定。综合购物体验,并发情况下效率等情况。在购物流程和规则上也要做优化,像你说的非秒杀情况,正常售卖提前提示买家库存可能不够充足,可能会延期发货什么的。
另外楼上说的一些解决方案,也都无法避免一些恶意操作的。
例如:提交订单或者加购物车占库存,存在恶拍风险。

 付款后更新库存,就会存在超卖风险。

因此,个人认为,除了在技术层面用锁机制和事务操作也好,或是走队列机制等等做好超卖预防措施外,也要在购物规则上做一定的优化,毕竟,这不是秒杀这种亏本赚吆喝的活动,理论上这些日常商品是不限购的,考虑到实际库存提示延期发货等。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题