加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

并发数据库挪用的PHP / Mysql题目

发布时间:2021-02-25 17:57:20 所属栏目:编程 来源:网络整理
导读:在PHP中行使innoDB表和mysqli包装器举办查询. 当前,我们碰着一个题目,就是每秒哀求1500次沟通剧本的流量激增. 环境是会见剧本的前X个用户赢得了嘉奖. 奖品是表“奖品”上的一笔记录,该表中有#个已声明的编号和#个已分派编号的计数. 一旦行使的金额 =分派的金

在PHP中行使innoDB表和mysqli包装器举办查询.

当前,我们碰着一个题目,就是每秒哀求1500次沟通剧本的流量激增.

环境是会见剧本的前X个用户赢得了嘉奖.

奖品是表“奖品”上的一笔记录,该表中有#个已声明的编号和#个已分派编号的计数.

一旦行使的金额> =分派的金额,我们将遏制嘉奖.

产生的环境是,在剧本的其他实例可以更新该行之前,对该剧本的很多哀求正在同时读取该行,从而向他们表现如故尚有必然数目的奖金需方式取.这导致我们嘉奖的金额高出了所分派的金额.

关于怎样规避这一点的任何设法?

最佳谜底 正确,您描写的是经典角逐前提.

一种办理方案是在更新之前,行使SELECT … FOR UPDATE在奖品表中的行上成立锁定. InnoDB将成立对锁的哀求次序,使每个哀求守候其轮到它可以获取锁为止.

可是,这不是一个好的办理方案,由于它将导致每个用户的赏识器旋转并旋转,守候相应.在处事器上,您将敏捷得到每秒1500个锁定哀求的列队.纵然每个会话仅耗费10毫秒来执行SELECT FOR UPDATE和后续UPDATE(这已经很是宏愿勃勃),每秒仍必要15.0秒的事变.到第二秒,您将有30.0秒的事变要做.

同时,用户正在查察他们的赏识器是否挂起,直到转向.这险些是一项计划的打破.

根基上,您必要一些办理方案来成立哀求的次序,即:

>环球
>原子
>快速
>异步

您可以让每个并发哀求行使AUTO_INCREMENT键对表举办INSERT,这将担保其次序.然后,一旦有X行,后续哀求就不会再插入任何行了.

另一种要领是行使动静行列.每个哀求只是将本身的哀求推入行列.然后,一个斲丧者从行列中拉出前X个哀求,并向他们嘉奖.行列中的别的哀求将被转储,而且不会得到嘉奖.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读