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

闻先后,术专攻
三人有师
习得文武艺,货与帝王家
人性不曾变,资本永无眠

-----------花有重开日,人无再少年-----------

  分类目录

  monitor(TD)

在看得见的地方站得直 是因为在看不见的地方站得稳

With great power comes great responsibility :能力越大责任越大。

让你变得更好的那个人,往往是你觉得很难与之相处的那个人

觉得自己做的到和不做的到,其实只在一念之间。

拿破仑波拿巴,他一生打了90%以上的胜仗,你在第一时间想到他一生中最著名的战役是什么?

停止狼狈 让错纯粹。

凡事顺其自然,遇事处于泰然,得意之时淡然,失意之时坦然,艰辛曲折必然,历尽沧桑悟然。