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

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

高老师9年前 (2018-01-01)PHP2190

应用场景: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 地址转换经纬度

php 地址转换经纬度

//$ak开发密钥,$cityname城市名称(支持省县乡详细地址) public  function   getposition($ak,$cityname){ $callback=array('lng'=>0,'l...

php 将数组键值转为变量

php 将数组键值转为变量

<?php $data=array('a'=>1,'b'=>2,'c'=>3,'d'=>4); extract($data); var_dump($a,$b,$c,$d); ?>在人人商城中捡到的...

php迭代器学习

php迭代器学习

php官方已经提供了Iterator(迭代器)接口,通过网上资料的学习,目前看适合超大集合或者数组提取使用。学习一个函数的实现对比内存占用差距.使用迭代器和普通循环实现range()函数。(1).普通循环实现range()函数。function newrange($low, $h...

PHP二维数组排序,PHP多维数组排序, array_multisort()

PHP二维数组排序,PHP多维数组排序, array_multisort()

使用php函数array_multisort()即可实现和SQL一样的order by排序. 例如我们需要对会员表按照主键降序排列,年龄升序排列://会员表数据 $list = []; $list[] = ['mid' =>&n...

php trait的使用

php trait的使用

PHP不像net支持多继承,自身只支持单继承,为了解决这个问题,php出了Trait这个特性,减少单继承语言的限制。并且能让代码复用率更高。说白了就是一个对象的属性和方法扩展工具一样。例如:trait exts {     public f...

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

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

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