文档章节

php解决下单、抽奖并发导致的库存负数的问题

吾爱
 吾爱
发布于 2014/06/18 17:25
字数 541
阅读 4777
收藏 20
点赞 2
评论 3
php

我们知道数据库处理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);



采用哪种方式,看并发数量吧。


© 著作权归作者所有

共有 人打赏支持
吾爱
粉丝 142
博文 257
码字总数 89193
作品 0
后端工程师
加载中

评论(3)

吾爱
吾爱

引用来自“let”的评论

嗯 最好使用redis,那是基于原子操作的
文件操作 性能不高
是的,等有空再迁移吧,架构太混乱,不太想动
letwang
letwang
嗯 最好使用redis,那是基于原子操作的
文件操作 性能不高
记住一座城
记住一座城
刚好用上,感谢。
PHP解决抢购、秒杀、抢楼、抽奖等阻塞式高并发库存防控超量的思路方法

如今在电商行业里,秒杀抢购活动已经是商家常用促销手段。但是库存数量有限,而同时下单人数超过了库存量,就会导致商品超卖甚至库存变负数的问题。 又比如:抢购火车票、论坛抢楼、抽奖乃至爆...

fzxu_05 ⋅ 2015/12/06 ⋅ 0

PHP解决抢购、秒杀、抢楼、抽奖等阻塞式高并发库存防控超量的思路方法

如今在电商行业里,秒杀抢购活动已经是商家常用促销手段。但是库存数量有限,而同时下单人数超过了库存量,就会导致商品超卖甚至库存变负数的问题。 又比如:抢购火车票、论坛抢楼、抽奖乃至爆...

bengozhong ⋅ 2016/08/31 ⋅ 0

怎么防止多用户同一时间抢购同一商品,防止高并发同时下单同一商品,大牛们献出你们所积累的知识吧?请教

最近在做抢购系统,但头疼的是,在多用户高并发的情况下经常会库存出现问题。排查到,在同一时间内多用户同时下单导致查询和插入不同步了,而查询中跟插入又有时间差而在高并发的情况下导致库...

键盘浪人 ⋅ 2014/12/25 ⋅ 10

常见并发问题

重复添加购物车 背景 购物车中同一商品只能有一条记录 添加购物车时,如果商品已经存在,则在原来的数量上增加;如果不存在,则insert一条数据 错误逻辑    添加购物车流程图 时间线示意图...

齐晋 ⋅ 2017/04/12 ⋅ 0

高并发核心技术 - 订单与库存

高并发核心技术 - 订单与库存 问题: 一件商品只有100个库存,现在有1000或者更多的用户来购买,每个用户计划同时购买1个到几个不等商品。如何保证库存在高并发的场景下是安全的。 1.不多发 ...

yunlielai ⋅ 03/19 ⋅ 0

PHP高并发下单用事务可以解决吗?

一个下单的小示例(上代码,没加事务的时候): class IndexController extends Controller { public function index(){ $stock = M('stock'); $log = M('log'); $condition['id'] = 1; if($......

火龙神S ⋅ 2016/06/15 ⋅ 1

PHP高并发下单用事务可以解决吗?

一个下单的小示例(上代码,没加事务的时候): class IndexController extends Controller { public function index(){ $stock = M('stock'); $log = M('log'); $condition['id'] = 1; if($......

火龙神S ⋅ 2016/06/15 ⋅ 4

(随记)php高并发

最近在做一个课程的购买功能,微信支付,以后可能会做团购或者拼团等功能,所以今天想找一找有关秒杀高并发的问题。 我理解的方法如下: 用另外的单进程处理队列,下单请求都放到队列中,一个...

llnuannuan ⋅ 2017/05/21 ⋅ 0

如何解决秒杀的性能问题和超卖的讨论

如何解决秒杀的性能问题和超卖的讨论 最近业务试水电商,接了一个秒杀的活。之前经常看到淘宝的同行们讨论秒杀,讨论电商,这次终于轮到我们自己理论结合实际一次了。 ps:进入正文前先说一点...

fdhay ⋅ 2016/09/08 ⋅ 0

如何解决秒杀的性能问题和超卖的讨论

最近业务试水电商,接了一个秒杀的活。之前经常看到淘宝的同行们讨论秒杀,讨论电商,这次终于轮到我们自己理论结合实际一次了。   ps:进入正文前先说一点个人感受,之前看淘宝的ppt感觉都...

真爱2015 ⋅ 2016/08/15 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

使用 vue-cli 搭建项目

vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一、 安装 node.js 首先需要安装node环境,可以直接到中...

初学者的优化 ⋅ 22分钟前 ⋅ 0

设计模式 之 享元模式

设计模式 之 享元模式 定义 使用共享技术来有效地支持大量细粒度对象的复用 关键点:防止类多次创建,造成内存溢出; 使用享元模式来将内部状态与外部状态进行分离,在循环创建对象的环境下,...

GMarshal ⋅ 37分钟前 ⋅ 0

SpringBoot集成Druid的最简单的小示例

参考网页 https://blog.csdn.net/king_is_everyone/article/details/53098350 建立maven工程 Pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM......

karma123 ⋅ 今天 ⋅ 0

Java虚拟机基本结构的简单记忆

Java堆:一般是放置实例化的对象的地方,堆分新生代和老年代空间,不断未被回收的对象越老,被放入老年代空间。分配最大堆空间:-Xmx 分配初始堆空间:-Xms,分配新生代空间:-Xmn,新生代的大小一...

算法之名 ⋅ 今天 ⋅ 0

OSChina 周日乱弹 —— 这么好的姑娘都不要了啊

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @TigaPile :分享曾惜的单曲《讲真的》 《讲真的》- 曾惜 手机党少年们想听歌,请使劲儿戳(这里) @首席搬砖工程师 :怎样约女孩子出来吃饭,...

小小编辑 ⋅ 今天 ⋅ 8

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部