应用场景:PHP模拟购买,商品数量大于0才能购买
常见代码:
<?php //连接数据库 $con=mysqli_connect("localhost","ihuohuo","927464cy","ihuohuo"); //查询商品数量是否大于0 $res=mysqli_fetch_assoc(mysqli_query($con,'SELECT total FROM shop WHERE id=1 LIMIT 1')); if($res['total']>0){ mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1'); } unset($res); mysqli_close($con); ?>
以上代码在少量访问情况下不会出现问题,并发量较高会导致商品数量为负值
修正后代码:
<?php $con=mysqli_connect("localhost","ihuohuo","927464cy","ihuohuo"); mysqli_query($con, 'BEGIN'); $res=mysqli_fetch_assoc(mysqli_query($con,'SELECT total FROM shop WHERE id=1 LIMIT 1 FOR UPDATE')); if($res['total']>0){ mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1 '); } mysqli_query($con, 'COMMIT'); unset($res); mysqli_close($con); ?>
解析:在mysql中通过 FOR UPDATE锁住本行记录,只有事务commit之后其他进程才能继续操作本条记录,一定要注意3点, FOR UPDATE锁表必须在事务begin和commit之间完成。
当然您可以通过文件锁完成,mysql行锁的开销还是比较大的,本站搜索文件锁。
<?php $base64_body = substr(strstr($_POST[base64],','),1); $data= base64_decode($base64_body); file_put_contents($_SERVER[&q...
首先下载wkhtmltox-0.12.4_linux-generic-amd64.tar.xz (不要下载RPM包,依赖太多,需要x-server支持),并解压,执行测试运行正常tar wkhtmltox-0.12.4_linux-generic-amd64.tar.xzcd...
本篇文章不是讲解如何用.net开发自己的dll然后PHP通过com调用。主要记录PHP官方支持的DOTNET 基本语法如下:$obj = new DOTNET("assembly", "classname")a...
逛公众号文章看到文章"php实现事件监听与触发的方法,你用过吗?",我就好奇了,php又不是asp.net的webform,哪里来的服务端事件监听。于是学习了一波。先看下监听类:class Event { /** &nbs...
(1).学习目标: 了解常见信号类型(百度PHP支持的信号类型),(2).相关函数学习: (2.1).pcntl_signal函数用于设置一个信号管理器接收进程信号,参数1:信号类型,参数2:回调函数,用于在接收到参数1类型的信...
第一次听说端口复用是在mixphp最新版本中发现的,mixphp启动监听9501端口,现在作者说可以多开几个进程来执行mixphp,我心里想了下再启动不是会端口冲突嘛,但是却没有问题,于是下载mixphp的源码解读,原来是启动http服务器使用new Co\Http\Server('0.0....