• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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程序设计有所帮助。

    您可能感兴趣的文章:
    • MySQL出现Waiting for table metadata lock的原因方法
    • MySQL表结构变更你不可不知的Metadata Lock详解
    • MYSQL METADATA LOCK(MDL LOCK)MDL锁问题分析
    • MySQL slave 延迟一列 外键检查和自增加锁
    • 浅谈MySQL next-key lock 加锁范围
    • MySQL 加锁控制并发的方法
    • MYSQL METADATA LOCK(MDL LOCK) 理论及加锁类型测试
    上一篇:PHP使用file_get_contents发送http请求功能简单示例
    下一篇:PHP实现的猴王算法(猴子选大王)示例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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