并发数据库调用的PHP / Mysql问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了并发数据库调用的PHP / Mysql问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1297字,纯文字阅读大概需要2分钟。
内容图文
在PHP中使用innoDB表和mysqli包装器进行查询.
当前,我们遇到一个问题,就是每秒请求1500次相同脚本的流量激增.
情况是访问脚本的前X个用户赢得了奖励.
奖品是表“奖品”上的一条记录,该表中有#个已声明的编号和#个已分配编号的计数.
一旦使用的金额> =分配的金额,我们将停止奖励.
发生的情况是,在脚本的其他实例可以更新该行之前,对该脚本的许多请求正在同时读取该行,从而向他们显示仍然还有一定数量的奖金需要领取.这导致我们奖励的金额超过了所分配的金额.
关于如何规避这一点的任何想法?
解决方法:
正确,您描述的是经典比赛条件.
一种解决方案是在更新之前,使用SELECT … FOR UPDATE在奖品表中的行上建立锁定. InnoDB将建立对锁的请求顺序,使每个请求等待其轮到它可以获取锁为止.
但是,这不是一个好的解决方案,因为它将导致每个用户的浏览器旋转并旋转,等待响应.在服务器上,您将迅速获得每秒1500个锁定请求的排队.即使每个会话仅花费10毫秒来执行SELECT FOR UPDATE和后续UPDATE(这已经非常雄心勃勃),每秒仍需要15.0秒的工作.到第二秒,您将有30.0秒的工作要做.
同时,用户正在查看他们的浏览器是否挂起,直到转向.这几乎是一项设计的突破.
基本上,您需要一些解决方案来建立请求的顺序,即:
>全球
>原子
>快速
>异步
您可以让每个并发请求使用AUTO_INCREMENT键对表进行INSERT,这将保证其顺序.然后,一旦有X行,后续请求就不会再插入任何行了.
另一种方法是使用消息队列.每个请求只是将自己的请求推入队列.然后,一个消费者从队列中拉出前X个请求,并向他们奖励.队列中的其余请求将被转储,并且不会获得奖励.
内容总结
以上是互联网集市为您收集整理的并发数据库调用的PHP / Mysql问题全部内容,希望文章能够帮你解决并发数据库调用的PHP / Mysql问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。