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脚本的10个技巧(4)
Oct 09 PHP
PHP操作XML作为数据库的类
Dec 19 PHP
php标签云的实现代码
Oct 10 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
Jun 05 PHP
php数据库备份还原类分享
Mar 20 PHP
thinkPHP实现瀑布流的方法
Nov 29 PHP
php使用GD创建保持宽高比缩略图的方法
Apr 17 PHP
PHP内存使用情况如何获取
Oct 10 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
Dec 11 PHP
php上传图片并压缩的实现方法
Dec 22 PHP
php使用escapeshellarg时中文被过滤的解决方法
Jul 10 PHP
PHP实现生成模糊图片的方法示例
Dec 21 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
收音机玩机评测 406 篇视频合集
2020/03/11 无线电
PHP 中文乱码解决办法总结分析
2009/07/30 PHP
php生成excel列名超过26列大于Z时的解决方法
2014/12/29 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
2016/03/30 PHP
CodeIgniter整合Smarty的方法详解
2017/08/25 PHP
php二维码生成以及下载实现
2017/09/28 PHP
jquery实用代码片段集合
2010/08/12 Javascript
在Ubuntu上安装最新版本的Node.js
2014/07/14 Javascript
jquery获得同源iframe内body下标签的值的方法
2014/09/25 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
浅谈js中的闭包
2015/03/16 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
jQueryUI中的datepicker使用方法详解
2016/05/25 Javascript
jQuery表单验证简单示例
2016/10/17 Javascript
IntersectionObserver API 详解篇
2016/12/11 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
ES10的13个新特性示例(小结)
2019/09/23 Javascript
在vue项目实现一个ctrl+f的搜索功能
2020/02/28 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
[42:24]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第一场 11.01
2020/11/02 DOTA
Python 正则表达式(转义问题)
2014/12/15 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
Python验证文件是否可读写代码分享
2017/12/11 Python
Python实现的简单读写csv文件操作示例
2018/07/12 Python
python和mysql交互操作实例详解【基于pymysql库】
2019/06/04 Python
Python程序暂停的正常处理方法
2019/11/07 Python
tensorflow指定CPU与GPU运算的方法实现
2020/04/21 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
科颜氏美国官网:Kiehl’s美国
2017/01/31 全球购物
北卡罗来纳州豪华家具和家居装饰店:Carolina Rustica
2018/10/30 全球购物
员工培训心得体会
2013/12/30 职场文书
运动会开幕式邀请函
2014/02/03 职场文书
财政局长个人总结
2015/03/04 职场文书
读《人生的智慧》有感:闲暇是人生的精华
2019/12/25 职场文书
Django drf请求模块源码解析
2021/06/08 Python
启动Tomcat时出现大量乱码的解决方法
2021/06/21 Java/Android