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 进行 这里不过多介绍

您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
本站大部分内容收集于互联网,如果有侵权内容、不妥之处,请联系删除。敬请谅解!

  Previous post Redis原子性原理
Next post   php 乐观锁原理

  关于博主【WANG-FEiHU】

Duplicate
-----------Complicate
--------------------------Appreciate
----------------------------------------[Fate]
-----------------------------------------------Elevate

三人行 有吾师

-------------花有重开日 梦无止境时-------------

  分类目录

  monitor(TD)

暗自伤心,不如立即行动。

再多一点努力,就多一点成功 的 可能

得意淡然,失意坦然;喜而不狂,忧而不伤。

海纳百川,有容乃大;壁立千仞,无欲则刚。

自古华山一条路,心不狠,站不稳

经历的越多才越明白,古人诚不欺我