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的session cookie错误
Aug 09 PHP
php下保存远程图片到本地的办法
Aug 08 PHP
PHP学习笔记之二
Jan 17 PHP
php实现快速排序的三种方法分享
Mar 12 PHP
php统计时间和内存使用情况示例分享
Mar 13 PHP
php中file_get_content 和curl以及fopen 效率分析
Sep 19 PHP
smarty内置函数foreach用法实例
Jan 22 PHP
Symfony2学习笔记之模板用法详解
Mar 17 PHP
Zend Framework框架路由机制代码分析
Mar 22 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
Apr 11 PHP
ThinkPHP下表单令牌错误与解决方法分析
May 20 PHP
php获取微信基础接口凭证Access_token
Aug 23 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代码
2008/04/09 PHP
php生成xml简单实例代码
2009/12/16 PHP
如何取得中文字符串中出现次数最多的子串
2013/08/08 PHP
php实现每天自动变换随机问候语的方法
2015/05/12 PHP
laravel手动创建数组分页的实现代码
2018/06/07 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
读jQuery之四(优雅的迭代)
2011/06/20 Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
2013/01/11 Javascript
解析Javascript中大括号“{}”的多义性
2013/12/02 Javascript
jQuery中end()方法用法实例
2015/01/08 Javascript
基于JS代码实现图片在页面中旋转效果
2016/06/16 Javascript
JAVA Web实时消息后台服务器推送技术---GoEasy
2016/11/04 Javascript
基于 webpack2 实现的多入口项目脚手架详解
2017/06/26 Javascript
ionic环境配置及问题详解
2017/06/27 Javascript
一个简易时钟效果js实现代码
2020/03/25 Javascript
JavaScript队列结构Queue实现过程解析
2020/03/07 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
[06:53]DOTA2每周TOP10 精彩击杀集锦vol.3
2014/06/25 DOTA
Python正则表达式教程之二:捕获篇
2017/03/02 Python
Python实现PS图像明亮度调整效果示例
2018/01/23 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
2019/12/11 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
浅谈Python xlwings 读取Excel文件的正确姿势
2021/02/26 Python
伦敦所有西区剧院演出官方票务代理:Theatre Tickets Direct
2017/05/26 全球购物
日本语毕业生自荐信
2014/02/01 职场文书
创业资金计划书
2014/02/06 职场文书
便利店促销方案
2014/02/20 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
关于读书的演讲稿800字
2014/08/27 职场文书
简易离婚协议书(范本)
2014/10/25 职场文书
大连导游词
2015/02/12 职场文书
幼儿园个人总结
2015/02/28 职场文书
驳回起诉民事裁定书
2015/05/19 职场文书
催款函怎么写
2015/06/24 职场文书
2015迎新晚会开场白
2015/07/17 职场文书