PHP+MySQL高并发加锁事务处理问题解决方法


Posted in PHP onApril 30, 2018

本文实例讲述了PHP+MySQL高并发加锁事务处理问题解决方法。分享给大家供大家参考,具体如下:

1、背景:

现在有这样的需求,插入数据时,判断test表有无username为‘mraz'的数据,无则插入,有则提示“已插入”,目的就是想只插入一条username为‘mraz'的记录。

2、一般程序逻辑如下:

$conn = mysqli_connect('127.0.0.1', 'root', '111111') or die(mysqli_error());
mysqli_select_db($conn, 'mraz');
$rs = mysqli_query($conn, 'SELECT count(*) as total FROM test WHERE username = "mraz" ');
$row = mysqli_fetch_array($rs);
if($row['total']>0){
  exit('exist');
}
mysqli_query($conn, "insert into test(username) values ('mraz')");
var_dump('error:'.mysqli_errno($conn));
$insert_id = mysqli_insert_id($conn);
echo 'insert_id:'.$insert_id.'<br>';
mysqli_free_result($rs);
mysqli_close($conn);

3、一般少量请求的时候,程序逻辑不会有问题。但是一旦高并发请求执行的话,程序并没有按预期执行,会插入多条username为‘mraz'的记录。

4、解决方案利用mysql的FOR UPDATE 语句和事务的隔离性。注意的是FOR UPDATE仅适用于InnoDB,且必须在事务(BEGIN/COMMIT)中才能生效。

调整代码后如下:

$conn = mysqli_connect('127.0.0.1', 'root', '111111') or die(mysqli_error());
mysqli_select_db($conn, 'mraz');
mysqli_query($conn, 'BEGIN');
$rs = mysqli_query($conn, 'SELECT count(*) as total FROM test WHERE username = "mraz" FOR UPDATE');
$row = mysqli_fetch_array($rs);
if($row['total']>0){
  exit('exist');
}
mysqli_query($conn, "insert into test(username) values ('mraz')");
var_dump('error:'.mysqli_errno($conn));
$insert_id = mysqli_insert_id($conn);
mysqli_query($conn, 'COMMIT');
echo 'insert_id:'.$insert_id.'<br>';
mysqli_free_result($rs);
mysqli_close($conn);

5、再利用php的curl模拟高并发请求该php脚本,查看数据库会只有一条username为‘mraz'的记录。达到程序执行的预期结果~

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php的控制语句
Oct 09 PHP
php 破解防盗链图片函数
Dec 09 PHP
php 网页游戏开发入门教程一(webgame+design)
Oct 26 PHP
mac下使用brew配置环境的步骤分享
May 23 PHP
PHP获取网址的顶级域名函数代码
Sep 24 PHP
php的array数组和使用实例简明教程(容易理解)
Mar 20 PHP
php顺序查找和二分查找示例
Mar 27 PHP
Yii2.0表关联查询实例分析
Jul 18 PHP
php compact 通过变量创建数组
Nov 15 PHP
PHP中Notice错误常见解决方法
Apr 28 PHP
搜索附近的人PHP实现代码
Feb 11 PHP
laravel-admin的图片删除实例
Sep 30 PHP
PHP使用file_get_contents发送http请求功能简单示例
Apr 29 #PHP
PHP实现通过strace定位故障原因的方法
Apr 29 #PHP
PHP性能测试工具xhprof安装与使用方法详解
Apr 29 #PHP
PHP使用curl_multi实现并发请求的方法示例
Apr 29 #PHP
PHP实现转盘抽奖算法分享
Apr 15 #PHP
PHP cURL获取微信公众号access_token的实例
Apr 28 #PHP
详解php与ethereum客户端交互
Apr 28 #PHP
You might like
地球防卫队:陪着奥特曼打小怪兽的人类力量 那些经典队服
2020/03/08 日漫
这东西价格,可以买几台TECSUN S-2000
2021/03/02 无线电
在PHP中利用wsdl创建标准webservice的实现代码
2011/12/07 PHP
php在项目中寻找代码的坏味道(综艺命名)
2012/07/19 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
2014/08/21 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
php抽象类和接口知识点整理总结
2019/08/02 PHP
如何在Mozilla Gecko 用Javascript加载XSL
2007/01/09 Javascript
JavaScript 对象链式操作测试代码
2010/04/25 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
javascript 实现简单的table排序及table操作练习
2012/12/28 Javascript
没有document.getElementByName方法
2013/08/19 Javascript
javascript日期格式化示例分享
2014/03/05 Javascript
jquery序列化表单去除指定元素示例代码
2014/04/10 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
javascript新闻跑马灯实例代码
2020/07/29 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
js判断出两个字符串最大子串的函数实现方法
2016/11/01 Javascript
JS异步文件分片断点上传的实现思路
2016/12/25 Javascript
NodeJS处理Express中异步错误
2017/03/26 NodeJs
如何用原生js写一个弹窗消息提醒插件
2019/05/24 Javascript
JS Array.from()将伪数组转换成数组的方法示例
2020/03/23 Javascript
Python解释执行原理分析
2014/08/22 Python
Python访问纯真IP数据库脚本分享
2015/06/29 Python
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
python Pandas库基础分析之时间序列的处理详解
2019/07/13 Python
在Python中使用filter去除列表中值为假及空字符串的例子
2019/11/18 Python
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
法人委托书
2014/07/31 职场文书
解除劳动合同证明书
2014/09/26 职场文书
单位病假条范文
2015/08/17 职场文书
springBoot基于webSocket实现扫码登录
2021/06/22 Java/Android
一些让Python代码简洁的实用技巧总结
2021/08/23 Python