PHP并发情况下如何防止商品礼品超卖、超发等情况

这是一个令很多人都头疼的问题 想起之前第一次做商城的时候就被这个问题给难住了

面对这个问题一般的解决办法有几个:

1:适用于较小型应用 一般采用 锁 来解决

  锁又有封为乐观锁以及悲观锁 悲观锁就不做过多的解释了,因为性能上比较不靠谱 所以建议采用乐观锁的解决方案

  乐观锁

  其实就有是在更新数据的时候加多几个where 条件 这样能够有效的防止多用户同时对一条数据进行操作

  例如:

UPDATE FROM goods SET num = num - 1 WHERE goodsid = 2 AND num > 0 

  这条语句仅仅只是加多了个 WHERE 条件 num > 0 但是其足以应付一般的应用的并发情况

  例如:

  当前库存 num 为 1

  且有两个用户同时发起下单请求

    那么这时候 稍微慢的那个用户就会遇到 num = 0 的情况 所以where条件不成立 插入失败 结果就是只有一个人下单成功。 

  当然还有更多情况可使用乐观锁解决 例如取不重复数据时 可多添加几个where 字段 取完即更新它 那么下次就不会有其他用户取到

 

  如果是针对只有一件商品的秒杀情况 那么可以这么解决:

   订单表(goodsid(商品) 加唯一索引)

start transaction;

insert into buy_record... 

if(唯一索引报错?){
    抛异常,已经秒过了,回滚..
}
      
UPDATE goods SET  num=num-1   WHERE goodsid=2  AND  num>0 ;      

if(受影响行数<=0){
      抛异常,商品秒完了,回滚...
}

 

2:大型应用 高并发

  一般采用  Redis 进行 这里不过多介绍

  

转载于:https://www.cnblogs.com/jason-encode/p/5733395.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值