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 相关文章推荐
简单采集了yahoo的一些数据
Feb 14 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
Sep 20 PHP
php地址引用(php地址引用的效率问题)
Mar 23 PHP
php截取后台登陆密码的代码
May 05 PHP
php存储过程调用实例代码
Feb 03 PHP
解析func_num_args与func_get_args函数的使用
Jun 24 PHP
PHP中spl_autoload_register()和__autoload()区别分析
May 10 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
May 28 PHP
php上传文件问题汇总
Jan 30 PHP
php中preg_match的isU代表什么意思
Oct 01 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
Feb 23 PHP
php数据库的增删改查 php与javascript之间的交互
Aug 31 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
wordpress之wp-settings.php
2007/08/17 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
2013/04/28 PHP
php使用str_replace替换多维数组的实现方法分析
2017/06/15 PHP
Add Formatted Text to a Word Document
2007/06/15 Javascript
jquery一般方法介绍 入门参考
2011/06/21 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
2015/03/10 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
高性能JavaScript 重排与重绘(2)
2015/08/11 Javascript
详解WordPress开发中get_current_screen()函数的使用
2016/01/11 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
浅谈键盘上回车按钮的js触发事件
2017/02/13 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
js 提取某()特殊字符串长度的实例
2017/12/06 Javascript
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
Vue.js的动态组件模板的实现
2018/11/26 Javascript
Vue项目实现简单的权限控制管理功能
2019/07/17 Javascript
python列表与元组详解实例
2013/11/01 Python
理解python多线程(python多线程简明教程)
2014/06/09 Python
仅用500行Python代码实现一个英文解析器的教程
2015/04/02 Python
Python pickle模块用法实例分析
2015/05/27 Python
JPype实现在python中调用JAVA的实例
2017/07/19 Python
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
python实现装饰器、描述符
2018/02/28 Python
Python基于TCP实现会聊天的小机器人功能示例
2018/04/09 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
解决yum对python依赖版本问题
2019/07/05 Python
django 使用 PIL 压缩图片的例子
2019/08/16 Python
python七种方法判断字符串是否包含子串
2020/08/18 Python
会计与审计毕业生自荐信范文
2013/12/30 职场文书
班级德育工作实施方案
2014/02/21 职场文书
决心书标准格式
2014/03/11 职场文书
厨师个人自我鉴定范文
2014/04/19 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
OpenCV全景图像拼接的实现示例
2021/06/05 Python
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL