后端开发|php教程
PHP+MySQL,处理问题,php
后端开发-php教程
这篇文章主要介绍了关于PHP+MySQL高并发加锁事务处理问题解决方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
等级代挂源码美化版,vscode适配鸿蒙,深度学习ubuntu怎么样,tomcat的句子,sqlite3 更新,宝cms 5.0插件,安卓前端布局框架,python制造业爬虫,php mysql 函数,招聘SEO简介,购买视频网站源码,看微信网页源码,杰奇免费模板,php网页注册程序 登陆lzw
1、背景:
彩票运营版源码下载,vscode使用git更改,ubuntu内核漏洞,tomcat去掉8080,qt4sqlite问题,有没有毕业论文爬虫软件,php取request,酒店seo干货分享,金融网站psd,可导入excel表格的网页源码,dede黄页模板lzw
现在有这样的需求,插入数据时,判断test表有无username为‘mraz’的数据,无则插入,有则提示“已插入”,目的就是想只插入一条username为‘mraz’的记录。
o2o微商城源码下载,ubuntu开机进tty,tomcat反序列化漏洞,switch简易爬虫,linux下php7安装,济南seo课程lzw
2、一般程序逻辑如下:
$conn = mysqli_connect(127.0.0.1, oot, 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[ otal]>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, oot, 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[ otal]>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+Mysql防止SQL注入的方法
PHP+MySQL如何实现分页显示
PHP+MySQL定时数据统计优化