本文实例讲述了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."
";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."
";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如何对mysql加锁_PHP+MySQL高并发加锁事务处理问题解决方法相关推荐

  1. mysql 高并发加锁_Mysql高并发加锁事务处理

    MySQL 使用 SELECT - FOR UPDATE 做事务写入前的确认 以MySQL 的InnoDB 为例,预设的 Tansaction isolation level 为 REPEATABLE ...

  2. mysql高并发不用事务_Mysql高并发加锁事务处理

    # Mysql高并发加锁事务处理 MySQL 使用 SELECT - FOR UPDATE 做事务写入前的确认 以MySQL 的InnoDB 为例,预设的 Tansaction isolation l ...

  3. java抢单功能_基于消息队列的高并发抢单功能实现方法与流程

    本发明涉及嵌入式软件中间件,具体涉及一种基于消息队列的高并发抢单功能实现方法. 背景技术: 中间件是一种独立的系统软件或服务程序,分布式应用系统借助这种软件在不同的技术之间共享资源,管理计算资源和网络 ...

  4. MySQL锁机制:高并发场景下该如何保证数据读写的安全性?

    锁!这个词汇在编程中出现的次数尤为频繁,几乎主流的编程语言都会具备完善的锁机制,在数据库中也并不例外,为什么呢?这里牵扯到一个关键词:高并发,由于现在的计算机领域几乎都是多核机器,因此再编写单线程的应 ...

  5. 阿里架构师教你处理高并发:2种方法,解决Redis和Mysql一致性

    需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...

  6. php mysql mysql_set_charset()._PHP:MySQL函数mysql_set_charset()的用法

    mysql_set_charset (PHP 5 >= 5.2.3) mysql_set_charset - 设置客户端的字符集 本扩展自 PHP 5.5.0 起已废弃,并在将来会被移除.应使用 ...

  7. PHP_MVC框架开发,nosql学习,mysql优化,以及高并发web架构处理

    文章目录 定义入口文件 完成自动加载 路由类 .htaccess explode trim array_slice 实现 控制器 加载控制器 数据库 初始化连接 数据查询函数 视图 extract 其 ...

  8. php并发访问排队_php解决高并发问题

    我们通常衡量一个Web系统的吞吐率的指标是QPS(Query Per Second,每秒处理请求数),解决每秒数万次的高并发场景,这个指标非常关键.举个例子,我们假设处理一个业务请求平均响应时间为10 ...

  9. JAVA RedisTemplate实现(加锁/解锁) 解决高并发问题

    基于传统的单机模式下的并发锁,已远远不能满足当下高并发大负载的情况,当下常用的并发处理如下 1.使用synchronized关键字 2.select    for update   乐观锁 3.使用r ...

最新文章

  1. 深度优先遍历_二叉树的深度优先遍历,理解框架真的能够套用题目吗?不了解执行过程可能很难。...
  2. jdk中java_怎样使用JavaJDK中Java?
  3. 在linux上执行.net Console apps
  4. Toast-Android 专属浮动小提示
  5. 机器学习基石--学习笔记01--linear hard SVM
  6. 打开你的脑洞:NER如何进行数据增强 ?
  7. 浅谈移动前端的最佳实践
  8. fetch jsonp连接mysql_后端接口开发:json,jsonp,restful
  9. 使用Python-Opencv实现人脸识别功能
  10. java公寓报修管理系统_学生公寓报修管理系统.pdf
  11. 全面了解三极管——三极管用作开关管1
  12. 梯形面积php,梯形的面积公式是什么
  13. 流媒体之播放flv格式的视频
  14. QQ邮箱一键删除所有邮件的方法
  15. 计算机上的360云盘派啥用,如何使用360云盘
  16. 中国各省存贷款余额(2003-2020年)
  17. Java 程序员,年薪 40W 需要什么水平?
  18. windows10系统怎么快速截屏
  19. 12【不定式  动名词】to-infinitive gerund
  20. 说文解字:SEO如何赢在起跑线上

热门文章

  1. Python项目实践:国家财政数据趋势演算
  2. LiveLayout
  3. java输出 4 7什么意思_Java学习4_一些基础4_输入输出_16.5.7
  4. c语言超市账务管理源代码,C语言 超市管理系统源程序.doc
  5. 如何在Timeline中创建自定义轨道?
  6. ShadeGraph教程之节点详解1:Artistic Nodes
  7. 面向初学者的带有MVC API的Android 管理表CRUD MSSQL
  8. Git 源码禁止使用 C 标准库中容易被错用的函数
  9. Debian 26 岁生日快乐!Happy DebianDay!
  10. NodeJs开发框架fortjs