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."
";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高并发加锁事务处理问题解决方法相关推荐
- mysql 高并发加锁_Mysql高并发加锁事务处理
MySQL 使用 SELECT - FOR UPDATE 做事务写入前的确认 以MySQL 的InnoDB 为例,预设的 Tansaction isolation level 为 REPEATABLE ...
- mysql高并发不用事务_Mysql高并发加锁事务处理
# Mysql高并发加锁事务处理 MySQL 使用 SELECT - FOR UPDATE 做事务写入前的确认 以MySQL 的InnoDB 为例,预设的 Tansaction isolation l ...
- java抢单功能_基于消息队列的高并发抢单功能实现方法与流程
本发明涉及嵌入式软件中间件,具体涉及一种基于消息队列的高并发抢单功能实现方法. 背景技术: 中间件是一种独立的系统软件或服务程序,分布式应用系统借助这种软件在不同的技术之间共享资源,管理计算资源和网络 ...
- MySQL锁机制:高并发场景下该如何保证数据读写的安全性?
锁!这个词汇在编程中出现的次数尤为频繁,几乎主流的编程语言都会具备完善的锁机制,在数据库中也并不例外,为什么呢?这里牵扯到一个关键词:高并发,由于现在的计算机领域几乎都是多核机器,因此再编写单线程的应 ...
- 阿里架构师教你处理高并发:2种方法,解决Redis和Mysql一致性
需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...
- 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 起已废弃,并在将来会被移除.应使用 ...
- PHP_MVC框架开发,nosql学习,mysql优化,以及高并发web架构处理
文章目录 定义入口文件 完成自动加载 路由类 .htaccess explode trim array_slice 实现 控制器 加载控制器 数据库 初始化连接 数据查询函数 视图 extract 其 ...
- php并发访问排队_php解决高并发问题
我们通常衡量一个Web系统的吞吐率的指标是QPS(Query Per Second,每秒处理请求数),解决每秒数万次的高并发场景,这个指标非常关键.举个例子,我们假设处理一个业务请求平均响应时间为10 ...
- JAVA RedisTemplate实现(加锁/解锁) 解决高并发问题
基于传统的单机模式下的并发锁,已远远不能满足当下高并发大负载的情况,当下常用的并发处理如下 1.使用synchronized关键字 2.select for update 乐观锁 3.使用r ...
最新文章
- 深度优先遍历_二叉树的深度优先遍历,理解框架真的能够套用题目吗?不了解执行过程可能很难。...
- jdk中java_怎样使用JavaJDK中Java?
- 在linux上执行.net Console apps
- Toast-Android 专属浮动小提示
- 机器学习基石--学习笔记01--linear hard SVM
- 打开你的脑洞:NER如何进行数据增强 ?
- 浅谈移动前端的最佳实践
- fetch jsonp连接mysql_后端接口开发:json,jsonp,restful
- 使用Python-Opencv实现人脸识别功能
- java公寓报修管理系统_学生公寓报修管理系统.pdf
- 全面了解三极管——三极管用作开关管1
- 梯形面积php,梯形的面积公式是什么
- 流媒体之播放flv格式的视频
- QQ邮箱一键删除所有邮件的方法
- 计算机上的360云盘派啥用,如何使用360云盘
- 中国各省存贷款余额(2003-2020年)
- Java 程序员,年薪 40W 需要什么水平?
- windows10系统怎么快速截屏
- 12【不定式 动名词】to-infinitive gerund
- 说文解字:SEO如何赢在起跑线上
热门文章
- Python项目实践:国家财政数据趋势演算
- LiveLayout
- java输出 4 7什么意思_Java学习4_一些基础4_输入输出_16.5.7
- c语言超市账务管理源代码,C语言 超市管理系统源程序.doc
- 如何在Timeline中创建自定义轨道?
- ShadeGraph教程之节点详解1:Artistic Nodes
- 面向初学者的带有MVC API的Android 管理表CRUD MSSQL
- Git 源码禁止使用 C 标准库中容易被错用的函数
- Debian 26 岁生日快乐!Happy DebianDay!
- NodeJs开发框架fortjs