应用场景: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 $data=array('a'=>1,'b'=>2,'c'=>3,'d'=>4); extract($data); var_dump($a,$b,$c,$d); ?>在人人商城中捡到的...
php官方的超全局变量$_SERVER['PHP_SELF']也能直接获取,只不过如果url参数太多也会获取。下面提供一个方法获取/* * 获取当前PHP文件名称 */ if (!function_exists('phpself...
(1).学习目标: 了解常见信号类型(百度PHP支持的信号类型),(2).相关函数学习: (2.1).pcntl_signal函数用于设置一个信号管理器接收进程信号,参数1:信号类型,参数2:回调函数,用于在接收到参数1类型的信...
(1)swoole启动的主进程是master进程负责全局管理,然后master进程会再fork一个manager进程。(2)manager进程开始统一管理进程创建回收管理。(3)manager进程根据设置的worker_num和task_worker_num来创建work进程和task进程因此启动s...
最近在编写windows php多线程的东西,从官网下载了PHP的线程安全版,尝试开启curl扩展extension=php_curl.dllphp -m 却提示 PHP Startup: Unable to load dynamic library 'C:\php\ext\php_curl...
将jsonp转为PHP数组和对象。/** * jsonp转数组|Jsonp转json * @param string $jsonp jsonp字符串 * @param bool $as...