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 相关文章推荐
无限级别菜单的实现
Oct 09 PHP
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
Apr 12 PHP
PHP curl_setopt()函数实例代码与参数分析
Jun 02 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
php教程之phpize使用方法
Feb 12 PHP
destoon实现调用热门关键字的方法
Jul 15 PHP
php基于str_pad实现卡号不足位数自动补0的方法
Nov 12 PHP
php提高网站效率的技巧
Sep 29 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
Dec 18 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
Apr 14 PHP
php命名空间设计思想、用法与缺点分析
Jul 17 PHP
php实现大文件断点续传下载实例代码
Oct 01 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房贷计算器实例代码,等额本息,等额本金
2017/04/01 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
2020/12/30 PHP
js操作CheckBoxList实现全选/反选(在客服端完成)
2013/02/02 Javascript
js中函数调用的两种常用方法使用介绍
2014/07/17 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
jQuery中prevUntil()方法用法实例
2015/01/08 Javascript
Backbone.js的一些使用技巧
2015/07/01 Javascript
XMLHttpRequest Level 2 使用指南
2016/08/26 Javascript
jQuery右下角悬浮广告实例
2016/10/17 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
JS实现AES加密并与PHP互通的方法分析
2017/04/19 Javascript
详解vue-cli 构建Vue项目遇到的坑
2017/08/30 Javascript
浅谈Vue SPA 首屏加载优化实践
2017/12/15 Javascript
vue2.0 路由不显示router-view的解决方法
2018/03/06 Javascript
微信小程序表单验证form提交错误提示效果
2020/06/19 Javascript
微信小程序与公众号卡券/会员打通的问题
2019/07/25 Javascript
举例讲解Python中的身份运算符的使用方法
2015/10/13 Python
利用python模拟sql语句对员工表格进行增删改查
2017/07/05 Python
python 地图经纬度转换、纠偏的实例代码
2018/08/06 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
django form和field具体方法和属性说明
2020/07/09 Python
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
大学生应聘自荐信
2013/10/11 职场文书
工程造价与管理专业应届生求职信
2013/11/23 职场文书
幼儿园园长岗位职责
2013/11/26 职场文书
文明餐桌活动方案
2014/02/11 职场文书
企业节能减排实施方案
2014/03/19 职场文书
中学生国旗下讲话稿
2014/04/26 职场文书
群众路线党员个人剖析材料
2014/10/08 职场文书
捐助感谢信
2015/01/22 职场文书
清洁员岗位职责
2015/02/15 职场文书
邮政营业员岗位职责
2015/04/14 职场文书
个人工作违纪检讨书
2015/05/05 职场文书
公司开业主持词
2015/07/02 职场文书
使用jpa之动态插入与修改(重写save)
2021/11/23 Java/Android