首页 / MYSQL / MySQL在高负载,竞争条件下?
MySQL在高负载,竞争条件下?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL在高负载,竞争条件下?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1562字,纯文字阅读大概需要3分钟。
内容图文
![MySQL在高负载,竞争条件下?](/upload/InfoBanner/zyjiaocheng/881/d74528bfa5924b47857cc517f688b169.jpg)
我正在参与的应用程序正在经历竞赛条件的影响.情况如下,通常,负责某种繁重的应用程序逻辑的页面采用以下格式:
从测试中选择并确定是否已经有匹配子句的行.
如果已经存在匹配的行,则在此终止,否则继续进行应用程序逻辑
将与我们的初始选择匹配的值插入测试表.
通常,这可以正常工作并将动作限制为一次执行.但是,在高负载和用户滥用的情况下,有意同时发送许多请求,MySQL允许运行应用程序逻辑的许多实例,而绕过了select子句的限制.
它似乎实际上运行类似:
从测试中选择
从测试中选择
从测试中选择
(所有都通过了支票)
插入测试
插入测试
插入测试
我相信这样做是出于效率方面的考虑,但在我的应用程序上下文中却产生了严重的影响.我试图使用Get_Lock()和Release_Lock(),但这在高负载下似乎还不够用,因为竞态条件似乎仍然存在.由于应用程序逻辑非常繁重并且涉及的所有表都不具有事务处理能力,因此也不可能进行事务处理.
对于熟悉此行为的任何人,是否可以关闭这种处理方式,以便MySQL始终按接收查询的顺序处理查询?还有另一种方法可以使这种查询成为原子的吗?任何有关此问题的帮助将不胜感激,我找不到有关此行为的大量文献记录.
解决方法:
这里的问题是,正如您推测的那样,您处于比赛状态.
SELECT和INSERT必须是一个原子单位.
您执行此操作的方式是通过交易.您不能安全地进行SELECT,然后返回PHP,并假定在进行INSERT时SELECT的结果将反映数据库状态.
如果无法按照您说的那样设计良好的事务(正确的解决方案)-我仍然强烈建议他们-您将必须进行最终的INSERT原子检查,其假设是否仍然正确(例如,通过INSERT IF) NOT EXISTS,存储过程或在应用程序中捕获INSERT的错误).如果不是,它将中止回到您的PHP代码,这必须重新开始逻辑.
顺便说一句,MySQL可能按照接收到的顺序执行请求.可能有多个同时连接来接收SELECT A,SELECT B,INSERT A,INSERTB.因此,唯一的“解决方案”是一次只允许一个连接-这将杀死您的可伸缩性.
内容总结
以上是互联网集市为您收集整理的MySQL在高负载,竞争条件下?全部内容,希望文章能够帮你解决MySQL在高负载,竞争条件下?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。