繁体   English   中英

mysqli :: query()在选择查询时返回true

[英]mysqli::query() returns true on select queries

我正在尝试使用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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM