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);

 

转载于:https://www.cnblogs.com/yasuo/p/5454117.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Spring中使用JDBCJobStore配置Quartz

我将开始一些有关Quartz Scheduler内部&#xff0c;提示和技巧的系列文章&#xff0c;这是第0章-如何配置持久性作业存储。 在Quartz中&#xff0c;您基本上可以在将作业和触发器存储在内存中以及在关系数据库中进行选择&#xff08; Terracotta是最近添加的混合功能&#xff0…

rlwrap插件,实现sqlplus上下翻页

oracle在Linux下&#xff0c;sqlplus中不能上下翻&#xff0c;最主要我经常打错字&#xff01;嘿嘿 01、下载 RPM &#xff1a;http://rpmfind.net/linux/rpm2html/search.php?queryrlwrap tar.gz:https://fossies.org/linux/privat/rlwrap-0.42.tar.gz/ 百度云&#xff1a;h…

ice库c语言例子,很不多的ICE架构入门学习例子

虽然使用传统的SOCKET编程&#xff0c;我们可以更为清楚程序的性能&#xff0c;能够更直接的操控SOCKET的设置&#xff0c;比如发送超时时间&#xff0c;接受BUFFER的大小&#xff0c;以及进行自己的协议加密。但是由于其调试成本较高&#xff0c;且不易于分布式部署ICE 作为一…

程序员的十个层次,你属于哪一层?(转)

自西方文艺复兴以来&#xff0c;中国在自然科学方面落后西方很多&#xff0c;软件领域也不例外。当然现在中国的许多程序员们对此可能有许多不同的意见&#xff0c;有些人认为中国的程序员水平远落后于西方&#xff0c;有些则认为中国的程序员个人能力并不比西方的程序员差&…

操作系统基础篇

程序运行的4个因素 (1).程序设计语言 (2).编译系统 (3).操作系统 (4).指令集结构&#xff08;硬件系统&#xff09; 操作系统的定义&#xff1a;操作系统是掌控计算机上所有事情的软件系统(硬件资源&#xff0c;软件资源) 操作系统对内存&#xff0c;i/o&#xff0c;cpu&#x…

高效快速中值滤波算法c语言,快速中值滤波及c语言实现.docx

...快速中值滤波及c语言实现学生姓名&#xff1a; 刘 勇 学 号&#xff1a; 6100410218 专业班级&#xff1a; 数媒101【摘要】本文讨论了用c语言在微机上实现中值滤波及快速算法&#xff0c;在程序设计的过程中充分考虑到程序运行的时间复杂度和空间复杂度的问题&#xff0e;解…

Arquillian 1.0.0.Final正式发布! 准备使用GlassFish和WebLogic! 杀死所有虫子!

红帽公司和JBoss社区今天宣布的1.0.0.Final发布的Arquillian &#xff0c;其屡获殊荣的建在Java虚拟机&#xff08;JVM&#xff09;运行测试平台。 Arquillian大大减少了编写和执行Java中间件集成和功能测试所需的工作。 它甚至使测试工程师能够解决以前认为无法测试或测试成本…

Jquery选择器特殊字符问题

场景&#xff1a; $("#" AAA "")&#xff0c;AAA代表某表单ID 当AAA为普通字符串时&#xff0c;ok&#xff1b; 当AAA含有特殊符号时&#xff08;eg:a.b&#xff09;&#xff0c;获取不到该对象&#xff1b; 原因&#xff1a;特殊符号会进行转义&#xf…

qq五笔linux,QQ五笔 - 五笔小字典 QQ绑定很实用

九、 智能调频、空码检索、词序固定在QQ五笔中还有一些小亮点&#xff0c;比如它可以根据“最近输入”、“输入次数”对候选词排序。同时为了加快检索速度&#xff0c;默认只在常用字库(GB2312)中检索&#xff0c;只有出现空码后才会继续搜索容量更大的GBK字库&#xff0c;很好…

DFS:C 小Y的难题(1)

解题心得&#xff1a; 1、在明确使用DFS之后一定要找到递归函数的出口、方向&#xff0c;以及递归的点&#xff08;在某个情况下开始递归&#xff09;(void 也可以return&#xff0c;但是没有返回值)。递归时也要有递归的方向&#xff0c;最后都能够达到递归的出口。 2、在DF…

使用ActiveMQ支持Spring Integration路由

正如我在上 一篇 文章中所讨论的那样 &#xff0c;Spring Integration&#xff08;SI&#xff09; 是在Spring Framework之上构建的路由框架 &#xff0c;它使您可以使用经过验证的企业集成模式来通过消息传递解决系统集成问题。 配置好SI并执行路由和中介逻辑后&#xff0c;您…

quagga源码分析--路由信息处理zebra-rib

对于各个协议生成的路由信息的处理属于quagga中非常重要的一个功能&#xff0c;如何在内核进行路由增加&#xff0c;更新&#xff0c;删除是一个复杂的过程。 quagga在thread任务调度中加入了一种工作队列&#xff0c;work_queue&#xff0c;与内核的工作队列类似&#xff0c;是…

android 关闭蓝牙打电话功能,Android蓝牙开发【八】hfp接听、挂断电话

继续研究hfp相关功能。蓝牙耳机可以控制手机接听、拒接、挂断电话&#xff0c;拨打电话等功能。本文主要分析下起这些操作的大致流程。在系统应用Bluetooth中com_android_bluetooth.cpp提供了多个回调方法&#xff0c;由hardware、协议栈回调过来。蓝牙耳机的一些控制命令都会发…

android在listview中放入从sdcard读取的bitmap

重写viewbinder public class viewbinder_bookmark implements SimpleAdapter.ViewBinder{Overridepublic boolean setViewValue(View view, Object data, String textRepresentation){if(view instanceof ImageView && data instanceof Bitmap){ImageView imageview(I…

将状态机模式实现为流处理器

在我的上一个博客中&#xff0c;我说我真的以为某些“四人行”&#xff08;GOF&#xff09;模式已经过时了&#xff0c;如果不是过时的话肯定不受欢迎。 特别是我说过StateMachine不是那么有用&#xff0c;因为您通常会想到另一种更简单的方式来执行您正在执行的事情&#xff0…

android 自定义actionbar,如何让android的actionbar浮动且透明

如上图所示&#xff0c;谷歌地图的actionbar是透明的&#xff0c;且浮动在整个布局之上&#xff0c;没有占用布局空间。其实要做到这样的效果&#xff0c;我们首先想到的是两个方面&#xff1a;1.将让actionbar浮动起来。2.给actionbar一个背景&#xff0c;可以为颜色也可以为图…

CentOS 7安装redis及php扩展

安装remi源 # wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm # rpm -Uvh remi-release-7.rpm # sed -i -e "s/enabled1/enabled0/g" /etc/yum.repos.d/remi.repo 确认使用remi源时安装的Redis版本。 安装Redis 使用remi源yum安装Redis。 # yum …

对Openshift上的Play Framework 2应用进行故障排除

Openshift故障排除 使用“ 自己动手”应用程序类型&#xff0c;您实际上可以有很大的自由度来支持几乎可以在Linux机器上构建和运行的任何框架或服务器。 但是您必须做功课&#xff0c;并做一些研究。 因此&#xff0c;在本文中&#xff0c;我将向您展示一些我在使用Openshift和…

关于更换头像的整个过程理解

之前我遇到一个问题&#xff0c;就是怎样修改头像&#xff0c;都没有更改&#xff0c;后来把某个参数置为null&#xff0c;就解决了问题&#xff0c;但是知其然还要知其所以然&#xff0c;现在还是着重去梳理整个流程 头像&#xff0c;需要关注的是3个变量&#xff1a; 本地地址…

Ajax与CustomErrors的尴尬

在ASP.NET程序中&#xff0c;为了给用户显示友好的错误信息&#xff0c;通常在web.config中进行如下的设置&#xff1a; <customErrors mode"RemoteOnly" defaultRedirect"/error/error.htm"> </customErrors> 但如果是一个ajax请求在服务端发…