php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题


Posted in PHP onJune 19, 2014

我们知道数据库处理sql是一条条处理的,假设购买商品的流程是这样的:

sql1:查询商品库存

if(库存数量 > 0)
{
  //生成订单...
  sql2:库存-1
}

当没有并发时,上面的流程看起来是如此完美,假设同时两个人下单,而库存只有1个了,在sql1阶段两个人查询到的库存都是>0的,于是最终都执行了sql2,库存最后变为-1,超售了,要么补库存,要么等用户投诉吧。

解决这个问题比较流行的思路:

1.用额外的单进程处理一个队列,下单请求放到队列里,一个个处理,就不会有并发的问题了,但是要额外的后台进程以及延迟问题,不予考虑。

2.数据库乐观锁,大致的意思是先查询库存,然后立马将库存+1,然后订单生成后,在更新库存前再查询一次库存,看看跟预期的库存数量是否保持一致,不一致就回滚,提示用户库存不足。

3.根据update结果来判断,我们可以在sql2的时候加一个判断条件update ... where 库存>0,如果返回false,则说明库存不足,并回滚事务。

4.借助文件排他锁,在处理下单请求的时候,用flock锁定一个文件,如果锁定失败说明有其他订单正在处理,此时要么等待要么直接提示用户"服务器繁忙"

本文要说的是第4种方案,大致代码如下:

阻塞(等待)模式

<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX))
{
  //..处理订单
  flock($fp,LOCK_UN);
}
fclose($fp);
?>

非阻塞模式

<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX | LOCK_NB))
{
  //..处理订单
  flock($fp,LOCK_UN);
}
else
{
  echo "系统繁忙,请稍后再试";
}

fclose($fp);
?>
PHP 相关文章推荐
PHP4在WinXP下IIS和Apache2服务器上的安装实例
Oct 09 PHP
发布一个迷你php+AJAX聊天程序[聊天室]提供下载
Jul 21 PHP
fleaphp常用方法分页之Pager使用方法
Apr 23 PHP
PHP 遍历文件实现代码
May 04 PHP
PHP UTF8中文字符截断函数代码
Sep 11 PHP
PHP实现单例模式最安全的做法
Jun 13 PHP
DOM基础及php读取xml内容操作的方法
Jan 23 PHP
详解PHP序列化反序列化的方法
Oct 27 PHP
php+ajax实现商品对比功能示例
Apr 13 PHP
PHP使用观察者模式处理异常信息的方法详解
Sep 24 PHP
关于laravel后台模板laravel-admin select框的使用详解
Oct 03 PHP
在laravel中实现事务回滚的方法
Oct 10 PHP
PHP base64编码后解码乱码的解决办法
Jun 19 #PHP
PHP安全的URL字符串base64编码和解码
Jun 19 #PHP
PHP中的多行字符串传递给JavaScript的两种方法
Jun 19 #PHP
ThinkPHP模板引擎之导入资源文件方法详解
Jun 18 #PHP
ThinkPHP CURD方法之field方法详解
Jun 18 #PHP
ThinkPHP CURD方法之data方法详解
Jun 18 #PHP
ThinkPHP CURD方法之order方法详解
Jun 18 #PHP
You might like
改德生G88 - 加装等响度低音提升电路
2021/03/02 无线电
从PHP $_SERVER相关参数判断是否支持Rewrite模块
2013/09/26 PHP
php实现简单的语法高亮函数实例分析
2015/04/27 PHP
php计算title标题相似比的方法
2015/07/29 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
2016/05/20 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
PHP实现动态压缩js与css文件的方法
2018/05/02 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
JavaScript之HTMLCollection接口代码
2011/04/27 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
推荐5 个常用的JavaScript调试技巧
2015/01/08 Javascript
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
javascript for-in有序遍历json数据并探讨各个浏览器差异
2015/11/30 Javascript
如何使用AngularJs打造权限管理系统【简易型】
2016/05/09 Javascript
对angular4子路由&amp;辅助路由详解
2018/10/09 Javascript
基于vue的验证码组件的示例代码
2019/01/22 Javascript
微信小程序按钮点击跳转页面详解
2019/05/06 Javascript
jquery实现商品sku多属性选择功能(商品详情页)
2019/12/20 jQuery
如何在 Vue 表单中处理图片
2021/01/26 Vue.js
js闭包和垃圾回收机制示例详解
2021/03/01 Javascript
解决PySide+Python子线程更新UI线程的问题
2019/01/11 Python
python如何将两张图片生成为全景图片
2020/03/05 Python
Python Json数据文件操作原理解析
2020/05/09 Python
Python pandas 列转行操作详解(类似hive中explode方法)
2020/05/18 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
2020/07/06 Python
最新pycharm安装教程
2020/11/18 Python
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
意大利宠物用品购物网站:Bauzaar
2018/09/15 全球购物
离职保密承诺书
2014/05/28 职场文书
党的群众路线教育实践活动心得体会(企业)
2014/11/03 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
毕业生个人总结
2015/02/28 职场文书
幼儿园亲子活动通知
2015/04/24 职场文书
Python下载商品数据并连接数据库且保存数据
2022/03/31 Python