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.ini中添加extension=php_mysqli.dll指令的说明
Jun 14 PHP
PHP 创建文件(文件夹)以及目录操作代码
Mar 04 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
Nov 01 PHP
Can't create/write to file 'C:\WINDOWS\TEMP\...MYSQL报错解决方法
Jun 30 PHP
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
Jul 17 PHP
PHP逐行输出(ob_flush与flush的组合)
Feb 04 PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
Jun 18 PHP
解析CI的AJAX分页 另类实现方法
Jun 27 PHP
使用PHP获取汉字的拼音(全部与首字母)
Jun 27 PHP
PHP实现的蚂蚁爬杆路径算法代码
Dec 03 PHP
PHP中的use关键字及文件的加载详解
Nov 28 PHP
laravel框架 api自定义全局异常处理方法
Oct 11 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
深入探讨:Nginx 502 Bad Gateway错误的解决方法
2013/06/03 PHP
PHP函数getenv简介和使用实例
2014/05/12 PHP
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
2013/12/25 Javascript
js仿百度贴吧验证码特效实例代码
2014/01/16 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
JS实现的仿淘宝交易倒计时效果
2015/11/27 Javascript
通过点击jqgrid表格弹出需要的表格数据
2015/12/02 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
手机软键盘弹出时影响布局的解决方法
2016/12/15 Javascript
vue实现简单实时汇率计算功能
2017/01/15 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
2017/01/15 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
JS和JQuery实现雪花飘落效果
2017/11/30 jQuery
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
2020/06/05 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
2020/07/27 Javascript
浅谈vue生命周期共有几个阶段?分别是什么?
2020/08/07 Javascript
原生JS实现弹幕效果的简单操作指南
2020/11/10 Javascript
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
Python中的下划线详解
2015/06/24 Python
Django与遗留的数据库整合的方法指南
2015/07/24 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
2019/09/26 Python
加拿大在线隐形眼镜专家:PerfectLens.ca
2016/11/19 全球购物
英国在线发型和美容产品商店:Beauty Cutie
2019/04/27 全球购物
Stio官网:男女、儿童户外服装
2019/12/13 全球购物
初三物理教学反思
2014/01/21 职场文书
市场营销专业毕业生求职信
2014/03/26 职场文书
企业负责人任命书
2014/06/05 职场文书
经典演讲稿开场白
2014/08/25 职场文书
普通党员对照检查材料
2014/08/28 职场文书
优秀共产党员事迹材料2016
2016/02/29 职场文书
2016班级元旦联欢会开幕词
2016/03/04 职场文书
Java处理延时任务的常用几种解决方案
2022/06/01 Java/Android
windows server 2012安装FTP并配置被动模式指定开放端口
2022/06/10 Servers