【发布时间】:2012-02-03 16:25:02
【问题描述】:
在我参与的应用程序中,我遇到了竞态条件的影响。情况如下,一般来说,负责一些繁重的应用逻辑的页面就是这样的格式:
从test 中选择并确定是否有行已经与子句匹配。
如果匹配的行已经存在,我们将在此处终止,否则我们继续执行应用程序逻辑
将与我们初始选择匹配的值插入到test 表中。
通常,这可以正常工作并将操作限制为单次执行。但是,在有意同时发送许多请求的高负载和用户滥用情况下,MySQL 允许运行应用程序逻辑的多个实例,从而绕过 select 子句的限制。
它似乎实际上运行类似:
从测试中选择
从测试中选择
从测试中选择
(全部通过检查)
插入测试
插入测试
插入测试
我认为这样做是出于效率原因,但它对我的应用程序的上下文有严重的影响。我曾尝试使用 Get_Lock() 和 Release_Lock() 但这在高负载下似乎还不够,因为竞争条件似乎仍然存在。事务也是不可能的,因为应用程序逻辑非常繁重,并且涉及的所有表都不支持事务。
对于熟悉这种行为的任何人,是否可以关闭这种类型的处理,以便 MySQL 始终按照接收到的顺序处理查询?还有另一种方法可以使此类查询原子化吗?对此问题的任何帮助将不胜感激,我找不到有关此行为的太多记录。
【问题讨论】:
标签: mysql