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种方案,大致代码如下:

//阻塞(等待)模式

?


1

2

3

4

5

6

7

8

9

<?php

$fp = fopen("lock.txt", "w+");

if(flock($fp,LOCK_EX))

{

    //..处理订单

    flock($fp,LOCK_UN);

}

fclose($fp);

//非阻塞模式

?


1

2

3

4

5

6

7

8

9

10

11

12

13

<?php

$fp = fopen("lock.txt", "w+");

if(flock($fp,LOCK_EX | LOCK_NB))

{

    //..处理订单

    flock($fp,LOCK_UN);

}

else

{

    echo "系统繁忙,请稍后再试";

}

fclose($fp);

时间: 2024-07-31 13:52:50

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

数据库并发导致的脏读 不可重复读 幻读的处理方法

在做ERP订单接入仓库库存的时候出现了一个问题.下单会读取该商品是否有库存.如果有那么就下单 减去(可下单库存,物理库存不变) 没有则提示库存不足 在并发情况下就会导致 u1用户下单编号为1的商品1个  u2用户也下单编号为1的商品1个.编号为1的商品库存只有1个. 那么当u1在读取出数据的时候发现库存有一个 但是还没有写入库存的操作   u2也下单成功并提交  那么就会导致数据错乱 本来应该是只有u1会下单成功u2则提示库存不足 这里可以用事物的隔离机制或乐观锁来解决 事物是一个逻辑单元 原子

淘宝下单高并发解决方案(转)

淘宝下单高并发解决方案 周末参加了@淘宝技术嘉年华 主办的技术沙龙, 感觉收获颇丰,非常感谢淘宝人的分享.这里我把淘宝下单高并发解决方案的个人理解分享一下.我不是淘宝技术人员,本文只是写自己的理解,所以肯定是会有一些出入的. 在session中牧劳为我们介绍了淘宝下单部分的技术方案变迁,我不介绍变迁,而只对现有系统做介绍. 要优化下单,提高下单的TPS (Transaction per second),我们首先要做的是对下单的逻辑剥离,只保留核心部分,而把附加功能剔除出去.比如说下单要考虑库存量

[转]淘宝下单高并发解决方案

周末参加了@淘宝技术嘉年华 主办的技术沙龙, 感觉收获颇丰,非常感谢淘宝人的分享.这里我把淘宝下单高并发解决方案的个人理解分享一下.我不是淘宝技术人员,本文只是写自己的理解,所以肯定是会有一些出入的. 在session中牧劳为我们介绍了淘宝下单部分的技术方案变迁,我不介绍变迁,而只对现有系统做介绍. 要优化下单,提高下单的TPS (Transaction per second),我们首先要做的是对下单的逻辑剥离,只保留核心部分,而把附加功能剔除出去.比如说下单要考虑库存量,考虑发短信,要给卖家发

淘宝下单高并发解决方案

这里我把淘宝下单高并发解决方案的个人理解分享一下.我不是淘宝技术人员,本文只是写自己的理解,所以肯定是会有一些出入的. 在session中牧劳为我们介绍了淘宝下单部分的技术方案变迁,我不介绍变迁,而只对现有系统做介绍. 要优化下单,提高下单的TPS (Transaction per second),我们首先要做的是对下单的逻辑剥离,只保留核心部分,而把附加功能剔除出去.比如说下单要考虑库存量,考虑发短信,要给卖家发旺旺消息通 知,要对订单做统计,要做销售额统计等等,这些功能是必要的,但是也是附加

转 mysql处理高并发,防止库存超卖

原文地址: mysql处理高并发,防止库存超卖 今天王总又给我们上了一课,其实MySQL处理高并发,防止库存超卖的问题,在去年的时候,王总已经提过:但是很可惜,即使当时大家都听懂了,但是在现实开发中,还是没这方面的意识.今天就我的一些理解,整理一下这个问题,并希望以后这样的课程能多点. 先来就库存超卖的问题作描述:一般电子商务网站都会遇到如团购.秒杀.特价之类的活动,而这样的活动有一个共同的特点就是访问量激增.上千甚至上万人抢购一个商品.然而,作为活动商品,库存肯定是很有限的,如何控制库存不让出

(转)mysql处理高并发,防止库存超卖

原文链接:http://blog.csdn.net/caomiao2006/article/details/38568825 今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖的问题,在去年的时候,王总已经提过:但是很可惜,即使当时大家都听懂了,但是在现实开发中,还是没这方面的意识.今天就我的一些理解,整理一下这个问题,并希望以后这样的课程能多点. 先来就库存超卖的问题作描述:一般电子商务网站都会遇到如团购.秒杀.特价之类的活动,而这样的活动有一个共同的特点就是访问量激增.上千甚至

解决数据库高并发

解决数据库高并发的常见方案: 1) 缓存式的 Web 应用程序架构: 在 Web 层和 DB(数据库)层之间加一层 cache 层,主要目的:减少数据库读取负担,提高数 据读取速度.cache 存取的媒介是内存,可以考虑采用分布式的 cache 层,这样更容易破除内存容量 的限制,同时增加了灵活性. 2) 增加 Redis 缓存数据库: 把经常访问到的数据而且不需要经常变化的数据放在缓存中. 主要针对于数据与用户无直接关联,写少读多的数据,使用缓存来减少数据库的压力. 第一获取数据从数据库中提取

修改DNS域名转发器解决IP地址解析错误导致的网站不能访问

修改DNS域名转发器解决IP地址解析错误导致的网站不能访问 首先谢谢同事林路的指导,才能顺利解决问题 打开网站,访问一个域名,DNS解析到错误的IP地址,那么将不能正确访问该网站 1.使用8.8.8.8(google 公用dns定位本地dns解析和google解析),这里是zh.wikipedia.org ping zh.wikipedia.org     159.106.121.75(这个是很多dns异常解析的地址) nslookup -qt zh.wikipedia.org 8.8.8.8

AngularJS进阶(二十八)解决AngualrJS页面刷新导致异常显示问题

解决AngualrJS页面刷新导致异常显示问题 绪 俗话说,细节决定成败,编程亦是如此.编程过程中我们可能会不自觉的忽视一些细节问题,殊不知,这些细节正是导致页面显示出现问题的地方.今略举一例,与君共勉之. 页面正常加载后,显示如下: 按F5刷新之后,页面如下所示: 很明显,页面显示出现了异常.回过头再看看Chrome的错误提示, 具体代码如下: 正是以上代码导致了错误的发生. 追根溯源 让我们回顾一下,错误到底是如何发生的.正常加载情况下,页面正常显示很容易理解,程序是按照既定的数据流走的.但