PHP+MySQL高并发加锁事务处理问题解决方法

 更新时间:2018年04月30日 13:48:25   作者:_Mraz  
这篇文章主要介绍了PHP+MySQL高并发加锁事务处理问题解决方法,结合实例形式分析了PHP+MySQL事务处理相关操作技巧与注意事项,需要的朋友可以参考下

本文实例讲述了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+mysql数据库操作入门教程》、《php+mysqli数据库程序设计技巧总结》、《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总

希望本文所述对大家PHP程序设计有所帮助。

相关文章

  • php 模拟POST提交的2种方法详解

    php 模拟POST提交的2种方法详解

    本篇文章是对php模拟POST提交的2种方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • php实现refresh刷新页面批量导入数据的方法

    php实现refresh刷新页面批量导入数据的方法

    这篇文章主要介绍了php实现refresh刷新页面批量导入数据的方法,借鉴了dedecms批量生成html的原理,采用refresh代替js跳转来实现,非常具有实用价值,需要的朋友可以参考下
    2014-12-12
  • php socket实现的聊天室代码分享

    php socket实现的聊天室代码分享

    这篇文章主要介绍了php socket实现的聊天室代码分享,本文实现代码来自国外友人,需要的朋友可以参考下
    2014-08-08
  • php文件上传、下载和删除示例

    php文件上传、下载和删除示例

    这篇文章主要为大家详细介绍了php文件上传、下载和删除示例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 基于php下载文件的详解

    基于php下载文件的详解

    本篇文章是对php下载文件进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • php代码中使用换行及(\n或\r\n和br)的应用

    php代码中使用换行及(\n或\r\n和br)的应用

    浏览器识别不了\n或\r\n,这两个换行符是文本换行符,文本文件有效;如果需要将结果输出到浏览器或打印到显示器,代码中使用br;如果只是在源代码中换行,则使用\n或\r\n,感兴趣的朋友可以了解下,或许对你学习php有所帮助
    2013-02-02
  • PHP中array_keys和array_unique函数源码的分析

    PHP中array_keys和array_unique函数源码的分析

    本文从array_keys和array_unique的源码分析出函数的性能,并给出了优化建议,十分不错的文章,有需要的小伙伴可以参考下
    2016-02-02
  • PHP 错误之引号中使用变量

    PHP 错误之引号中使用变量

    当看到错误提示 syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING
    2009-05-05
  • php 一元分词算法

    php 一元分词算法

    php 一元分词算法
    2009-11-11
  • PHP define函数的使用说明

    PHP define函数的使用说明

    PHP预先定义了几个常量,并提供了一种机制在运行时自己定义。常量和变量基本上是一样的,不同的是:常量必须用DEFINE函数定义,常量一旦定义好,就不能被重新定义了。
    2008-08-08

最新评论