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中的字符串函数
Nov 24 PHP
php获得当前的脚本网址
Dec 10 PHP
php array_intersect()函数使用代码
Jan 14 PHP
PHP 木马攻击防御技巧
Jun 13 PHP
PHP 数组遍历方法大全(foreach,list,each)
Jun 30 PHP
paypal即时到账php实现代码
Nov 28 PHP
PHP写杨辉三角实例代码
Jul 17 PHP
浅谈php优化需要注意的地方
Nov 27 PHP
YII Framework框架教程之国际化实现方法
Mar 14 PHP
Laravel配置全局公共函数的方法步骤
May 09 PHP
thinkphp3.2同时连接两个数据库的简单方法
Aug 13 PHP
php伪静态验证码不显示的解决方案
Sep 26 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操作MongoDB GridFS 存储文件的详解
2013/06/20 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
js中parseFloat(参数1,参数2)定义和用法及注意事项
2013/01/27 Javascript
通过js获取div的background-image属性
2013/10/15 Javascript
使表格的标题列可左右拉伸jquery插件封装
2014/11/24 Javascript
javascript制作的cookie封装及使用指南
2015/01/02 Javascript
js的form表单提交url传参数(包含+等特殊字符)的两种解决方法
2016/05/25 Javascript
AngularJS基础 ng-cloak 指令简单示例
2016/08/01 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
2017/01/04 Javascript
jQuery点击导航栏选中更换样式的实现代码
2017/01/23 Javascript
js代码延迟一定时间后执行一个函数的实例
2017/02/15 Javascript
Angularjs中的ui-bootstrap的使用教程
2017/02/19 Javascript
详解用node编写自己的cli工具
2017/05/23 Javascript
基于jquery实现多选下拉列表
2017/08/02 jQuery
Angularjs上传图片实例详解
2017/08/06 Javascript
浅析Node.js非对称加密方法
2018/01/29 Javascript
Vue使用zTree插件封装树组件操作示例
2019/04/25 Javascript
Python安装模块的常见问题及解决方法
2018/02/05 Python
Python字符串、整数、和浮点型数相互转换实例
2018/08/04 Python
python实现得到当前登录用户信息的方法
2019/06/21 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
在windows下使用python进行串口通讯的方法
2019/07/02 Python
Python实现的远程文件自动打包并下载功能示例
2019/07/12 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
numpy 声明空数组详解
2019/12/05 Python
python numpy--数组的组合和分割实例
2020/02/24 Python
css3 position fixed固定居中问题解决方案
2014/08/19 HTML / CSS
C#中类(class)与结构(struct)的异同
2013/11/03 面试题
党风廉政承诺书
2014/03/27 职场文书
大班亲子运动会方案
2014/06/10 职场文书
关于感恩的演讲稿500字
2014/08/26 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
大雁塔英文导游词
2015/02/10 职场文书
消防宣传标语大全
2015/08/03 职场文书
javascript数组includes、reduce的基本使用
2021/07/02 Javascript