我正在尝试使用MySQL建立一个队列(我知道,对我感到羞耻!)。我设置的方式是更新以在队列项上设置接收者ID,在更新发生后,我通过接收者ID选择更新的项目。
我遇到的问题是当我查询更新然后执行select时,select查询返回true而不是结果集。这似乎是在发出快速请求时发生的。
有谁知道为什么会这样?
提前致谢。
架构:
CREATE TABLE `Queue` (
`id` char(11) NOT NULL DEFAULT '',
`status` varchar(20) NOT NULL DEFAULT '',
`createdAt` datetime DEFAULT NULL,
`receiverId` char(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
出列:
update `'.self::getTableName().'`
set
`status` = 'queued',
`receiverId` = '%s'
where
`status` = 'queued'
and `receiverId` is null
order by id
limit 1;
select
*
from
`'.self::getTableName().'`
where
`receiverId` = \'%s\'
order by id
desc limit 1
答案 0 :(得分:1)
这听起来像某种竞争条件。您正在使用MyISAM,因此可能会推迟更新(特别是如果该表上有大量流量)。
true
返回表示您的select
查询已正确完成但已返回并且结果为空(无行)。如果发生这种情况的逻辑是等待,比如50毫秒,然后再试一次,你可能会发现事情正常。
编辑:您可以尝试在执行UPDATE之前锁定表,直到完成最后一次SELECT。但这可能会破坏应用程序其他部分的性能。最好的办法是让你的应用程序在竞争条件下变得强大。