应用场景: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行锁的开销还是比较大的,本站搜索文件锁。
重构框架的时候想要考虑支持下cli模式,于是参考了thinkphp的底层。/** * 获取应用根目录 * @return string */ public static function getRootP...
【一】.介绍session由于HTTP是无状态的请求,创建一个会话需要保持必须需要身份标识。当用户第一次访问,PHP会为用户创建一个唯一的sessionid,并将sessionid通过cookie发送给浏览器,并在服务器的临时文件创建一个以sessionid为名的文件用来保存这个sessionid保...
(1).在PHP中可以查看的环境变量包括: (1.1).电脑环境变量 (2.1).服务器环境变量(2).getenv()函数获取一个环境变量的值.参数1是环境变量的key,参数2值为true的时候仅从你的电脑环境变量中查找,参数2值为false会从两种变量中全部查询//获取我电脑登录的用户名,输出A...
posix_ttyname - 获取当前终端设备名称。<?php var_dump( posix_ttyname(STDOUT) );我们启动一个终端,执行上面的代码输出:/dev/tty1我们再启动一个终端,执行上面的代码输...
在项目下的composer配置文件修改(PaySdk是我这里一个支付sdk的目录,包含各种各样的支付sdk,这样写的意思让composer自动把PaySdk下的所有文件自动加载):"autoload": { &...
elasticsearch的操作都是基于http协议的,已经有现成的php类库,composer安装即可。{ "require": { &...