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 skymvc 一款轻量、简单的php
Jun 28 PHP
解析MySql与Java的时间类型
Jun 22 PHP
PHP反射类ReflectionClass和ReflectionObject的使用方法
Nov 13 PHP
使用PHPMailer实现邮件发送代码分享
Oct 23 PHP
PHP实现在线阅读PDF文件的方法
Jun 23 PHP
使用正则去除php代码中的注释方法
Nov 03 PHP
PHP实现查询手机归属地的方法详解
Apr 28 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
PHP7扩展开发之hello word实现方法详解
Jan 15 PHP
php实现构建排除当前元素的乘积数组方法
Oct 06 PHP
使用laravel的migrate创建数据表的方法
Sep 30 PHP
tp5修改(实现即点即改)
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/03 新手入门
php上传、管理照片示例
2006/10/09 PHP
PHP XML error parsing SOAP payload on line 1
2010/06/17 PHP
PHP mail()函数使用及配置方法
2014/01/14 PHP
PHP通过串口实现发送短信
2015/07/08 PHP
Laravel5.1 框架响应基本用法实例分析
2020/01/04 PHP
PHP网站常见安全漏洞,及相应防范措施总结
2021/03/01 PHP
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
append和appendTo的区别以及appendChild用法
2013/12/24 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
JS克隆,属性,数组,对象,函数实例分析
2016/11/26 Javascript
详解jQuery中的事件
2016/12/14 Javascript
JavaScript表单验证的两种实现方法
2017/02/11 Javascript
详谈$.data()的用法和作用
2017/02/13 Javascript
jQuery时间验证和转换为标准格式的时间格式
2017/03/06 Javascript
如何理解Vue的.sync修饰符的使用
2017/08/17 Javascript
es6在react中的应用代码解析
2017/11/08 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
2018/08/31 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
小程序自定义日历效果
2018/12/29 Javascript
微信小程序 select 下拉框组件功能
2019/09/09 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
python代码编写计算器小程序
2020/03/30 Python
python re模块匹配贪婪和非贪婪模式详解
2020/02/11 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
2020/10/15 Python
Java工程师面试集锦之Spring框架
2013/06/16 面试题
解决方案设计综合面试题
2015/08/31 面试题
银行演讲稿范文
2014/01/03 职场文书
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
建议书范文
2015/02/05 职场文书
给老婆的保证书怎么写
2015/05/08 职场文书
出纳试用期工作总结2015
2015/05/28 职场文书
关于Numpy之repeat、tile的用法总结
2021/06/02 Python