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开发者的10个技巧
Feb 25 PHP
zend api扩展的php对象的autoload工具
Apr 18 PHP
php学习笔记 [预定义数组(超全局数组)]
Jun 09 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
Jan 09 PHP
详解 PHP加密解密字符串函数附源码下载
Dec 18 PHP
简单实现PHP留言板功能
Dec 21 PHP
PHP使用strrev翻转中文乱码问题的解决方法
Jan 13 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
Jul 03 PHP
laravel中短信发送验证码的实现方法
Apr 25 PHP
php引用和拷贝的区别知识点总结
Sep 23 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
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
php堆排序实现原理与应用方法
2015/01/03 PHP
写一段简单的PHP建立文件夹代码
2015/01/06 PHP
php判断文件上传图片格式的实例详解
2017/09/30 PHP
javascript 进阶篇2 CSS XML学习
2012/03/14 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
JQuery实现防止退格键返回的方法
2015/02/12 Javascript
JavaScript使用位运算符判断奇数和偶数的方法
2015/06/01 Javascript
详细分析JavaScript函数定义
2015/07/16 Javascript
JavaScript多并发问题如何处理
2015/10/28 Javascript
jQuery与Ajax以及序列化
2016/02/01 Javascript
php基于redis处理session的方法
2016/03/14 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
JavaScript实现全选取消效果
2017/12/14 Javascript
JQuery实现ajax请求的示例和注意事项
2018/12/10 jQuery
微信小程序textarea层级过高的解决方法
2019/03/04 Javascript
js简单遍历获取对象中的属性值的方法示例
2019/06/19 Javascript
微信小程序实现商城倒计时
2020/11/01 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
Pycharm学习教程(2) 代码风格
2017/05/02 Python
Python闭包之返回函数的函数用法示例
2018/01/27 Python
python实现比较文件内容异同
2018/06/22 Python
python scp 批量同步文件的实现方法
2019/01/03 Python
python实现输出一个序列的所有子序列示例
2019/11/18 Python
python二元表达式用法
2019/12/04 Python
python多进程使用函数封装实例
2020/05/02 Python
GAP美国官网:美国休闲时尚品牌
2016/08/26 全球购物
企业管理专业个人求职信范文
2013/09/24 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
新书发布会策划方案
2014/06/09 职场文书
学习张丽丽心得体会
2014/09/03 职场文书
史上最全的军训拉歌口号
2015/12/25 职场文书
Redis模仿手机验证码发送的实现示例
2021/11/02 Redis
Python获取指定日期是"星期几"的6种方法
2022/03/13 Python
微信小程序 根据不同用户切换不同TabBar
2022/04/21 Javascript