当前位置:首页 > PHP > 正文内容

php mysql 行锁,php mysql 行级锁,php mysql 行锁定

高老师7年前 (2018-01-01)PHP1874

应用场景: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行锁的开销还是比较大的,本站搜索文件锁。

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/55.html

分享给朋友:

“ php mysql 行锁,php mysql 行级锁,php mysql 行锁定” 的相关文章

php使用swoole扩展推送消息

php使用swoole扩展推送消息

通过http推送消息给socket,socket服务再向客户端推送<?php /*  * Socket推送  * 请用守护进程方式启动php msgservice.php &   (socket只...

 php 判断是否post,php判断是否post提交,php 判断是否为post,php 判断get 还是post

php 判断是否post,php判断是否post提交,php 判断是否为post,php 判断get 还是post

if($_SERVER['REQUEST_METHOD'] == 'POST') { echo('This is  post '); } elseif ($_SERVER['...

redis订阅和发布,redis消息订阅与发布, phpredis订阅和发布

redis订阅和发布,redis消息订阅与发布, phpredis订阅和发布

Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者(publisher),订阅者(subscriber)和频道(channel)。 发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个...

php finally使用

php finally使用

<?php /**  * @throws Exception  */ function curl() {     throw  new \Exception('err...

php定义常量数组

php定义常量数组

<?php //php7+ define('CONFIG', [     'MYSQL' => '127.0.0.1',     ...

 php命令行中文乱码,php cli中文乱码

php命令行中文乱码,php cli中文乱码

<?php //如果支持exec函数,可以使用的方式 exec('chcp 65001'); //如果exec函数因安全问题禁用,可以使用的方式 pclose(popen('chcp 65001', 'r'));...