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 相关文章推荐
建立动态的WML站点(三)
Oct 09 PHP
PHP常用技巧总结(附函数代码)
Feb 04 PHP
PHP中对缓冲区的控制实现代码
Sep 29 PHP
php实现两表合并成新表并且有序排列的方法
Dec 05 PHP
smarty表格换行实例
Dec 15 PHP
php开发微信支付获取用户地址
Oct 04 PHP
PHP+JS实现的商品秒杀倒计时用法示例
Nov 15 PHP
PHP实践教程之过滤、验证、转义与密码详解
Jul 24 PHP
PHP上传文件及图片到七牛的方法
Jul 25 PHP
ThinkPHP5+Layui实现图片上传加预览功能
Aug 17 PHP
laravel 配置路由 api和web定义的路由的区别详解
Sep 03 PHP
thinkphp5 模型实例化获得数据对象的教程
Oct 18 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
如何开始收听短波广播
2021/03/01 无线电
PHP&amp;MYSQL服务器配置说明
2006/10/09 PHP
自己前几天写的无限分类类
2007/02/14 PHP
php 分页函数multi() discuz
2009/06/21 PHP
laravel 如何实现引入自己的函数或类库
2019/10/15 PHP
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
2011/02/25 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
Bootstrap每天必学之标签页(Tab)插件
2020/08/09 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
js单页hash路由原理与应用实战详解
2017/08/14 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
爬虫利器Puppeteer实战
2019/01/09 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题
2020/07/21 Javascript
Python random模块(获取随机数)常用方法和使用例子
2014/05/13 Python
用ReactJS和Python的Flask框架编写留言板的代码示例
2015/12/19 Python
python抓取文件夹的所有文件
2018/02/27 Python
执行Python程序时模块报错问题
2020/03/26 Python
利用python控制Autocad:pyautocad方式
2020/06/01 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
PyQt5 QDockWidget控件应用详解
2020/08/12 Python
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
C#实现启动一个进程
2016/10/01 面试题
会计电算化应届生求职信
2013/11/03 职场文书
小学生期末评语
2014/04/21 职场文书
会计学习心得体会
2014/09/09 职场文书
家长会欢迎词
2015/01/23 职场文书
公积金接收函格式
2015/01/30 职场文书
个人收入证明格式
2015/06/24 职场文书
2016年学校招生广告语
2016/01/28 职场文书
MySQL查询学习之基础查询操作
2021/05/08 MySQL