博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP并发情况下如何防止商品礼品超卖、超发等情况
阅读量:5051 次
发布时间:2019-06-12

本文共 804 字,大约阅读时间需要 2 分钟。

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

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

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:大型应用 高并发

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

  

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

你可能感兴趣的文章
spring security 11种过滤器介绍
查看>>
Hibernate一对多、多对一关联
查看>>
一、记录Git使用中遇到的问题及解决方法
查看>>
学习网址
查看>>
前端表格插件datatables
查看>>
内部类
查看>>
树链剖分入门
查看>>
图解算法时间复杂度
查看>>
UI_搭建MVC
查看>>
一个样例看清楚JQuery子元素选择器children()和find()的差别
查看>>
代码实现导航栏分割线
查看>>
Windows Phone开发(7):当好总舵主 转:http://blog.csdn.net/tcjiaan/article/details/7281421...
查看>>
VS 2010打开设计器出现错误
查看>>
SQLServer 镜像功能完全实现
查看>>
Vue-详解设置路由导航的两种方法
查看>>
一个mysql主从复制的配置案例
查看>>
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
dvwa网络渗透测试环境的搭建
查看>>
Win8 安装VS2012 和 Sql Server失败问题
查看>>
过点(2,4)作一直线在第一象限与两轴围成三角形,问三角形面积的最小值?...
查看>>