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读取目录下所有文件的代码
Jan 07 PHP
用PHP程序实现支持页面后退的两种方法
Jun 30 PHP
使用Limit参数优化MySQL查询的方法
Nov 12 PHP
Eclipse的PHP插件PHPEclipse安装和使用
Jul 20 PHP
PHPUnit安装及使用示例
Oct 29 PHP
浅析THINKPHP的addAll支持的最大数据量
Feb 03 PHP
浅谈json_encode用法
Mar 05 PHP
php实现可逆加密的方法
Aug 11 PHP
php while循环控制的简单实例
May 30 PHP
PHP获取用户客户端真实IP的解决方案
Oct 10 PHP
php使用curl实现简单模拟提交表单功能
May 15 PHP
通过PHP实现用户注册后邮箱验证激活
Nov 10 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
php实现的九九乘法口诀表简洁版
2014/07/28 PHP
php读取目录及子目录下所有文件名的方法
2014/10/20 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
window.location 对象所包含的属性
2014/10/10 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
微信小程序 火车票查询实例讲解
2016/10/17 Javascript
javascript 正则表达式去空行方法
2017/01/24 Javascript
js实现简单的获取验证码按钮效果
2017/03/03 Javascript
jquery实现的table排序功能示例
2017/03/10 Javascript
30分钟快速实现小程序语音识别功能
2018/11/27 Javascript
jquery插件开发模式实例详解
2019/07/20 jQuery
vue实现文件上传读取及下载功能
2020/11/17 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
javascript实现移动端轮播图
2020/12/09 Javascript
Python中for循环详解
2014/01/17 Python
python中map、any、all函数用法分析
2015/04/21 Python
TensorFlow平台下Python实现神经网络
2018/03/10 Python
Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度
2018/04/09 Python
python 列表递归求和、计数、求最大元素的实例
2018/11/28 Python
使用Django2快速开发Web项目的详细步骤
2019/01/06 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
浅谈TensorFlow中读取图像数据的三种方式
2020/06/30 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
财务会计实习报告体会
2013/12/20 职场文书
大四自我鉴定
2014/02/08 职场文书
乔丹名人堂演讲稿
2014/05/24 职场文书
新文化运动的口号
2014/06/21 职场文书
小学爱国卫生月活动总结
2014/06/30 职场文书
留学推荐信英文范文
2015/03/26 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS
Pytorch实现图像识别之数字识别(附详细注释)
2021/05/11 Python
MYSQL 的10大经典优化案例场景实战
2021/09/14 MySQL
Java实现房屋出租系统详解
2021/10/05 Java/Android