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)

生命要得到丰盛的收获,必需阳光;同时,也需要“雨”的浇灌。

如真 如假 如可分身饰演自己 会将心中的温柔 献出给你唯有的知己

如痴 如醉 还盼你懂珍惜自己 有天即使分离我都想你 我 真的想你

红雨瓢泼泛起了回忆怎么潜

你的选择是做或不做,但不做就永远不会有机会。

爱是有多荒唐 ,恨也能醉人肠。

人生应该树立目标,否则你的精力会白白浪费。

种下一颗树最好的时间是十年前,其次是现在。

你我亦无他 唯手熟尔

只要锦绣山河在,物质名利还复来

https://www.bilibili.com/video/av35928275/?p=391

如若不是为了一个人,谁肯枯守一座城。城市和爱情,总是有着这样那样的关系。我们会因为一个人,去到那座城,因为那是一座爱的城;我们也会因为一个人,离开一座城,那是一座绝望的伤城。