3

我正在尝试使用 MySQL 创建一个队列(我知道,真丢脸!)。我设置它的方式是进行更新以在队列项目上设置接收器 ID,在更新发生后,我通过接收器 ID 选择更新的项目。

我面临的问题是当我查询更新然后进行选择时,选择查询返回 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
4

1 回答 1

1

这听起来像是某种竞争条件。您正在使用 MyISAM,因此可能会推迟更新(特别是如果该表上有大量流量)。

true返回表明您的查询select已正确完成,但返回的结果集为空(无行)。如果发生这种情况时您的逻辑是等待 50 毫秒,然后再试一次,您可能会发现一切正常。

编辑:您可以尝试在执行 UPDATE 之前锁定表,直到您完成最后一次 SELECT。但这可能会破坏应用程序其他部分的性能。最好的办法是让您的应用程序在面对竞争条件时保持健壮。

于 2012-08-31T16:28:53.117 回答