mysqli :: query () devuelve verdadero en consultas seleccionadas

Estoy tratando de hacer una cola usando MySQL (lo sé, ¡qué vergüenza!). La forma en que lo tengo configurado es una actualización para establecer una ID de receptor en un elemento de la cola, después de que la actualización se lleva a cabo, selecciono el elemento actualizado por la ID del receptor.

El problema al que me enfrento es cuando consulto la actualización y luego hago la selección, la consulta de selección devuelve verdadero en lugar de un conjunto de resultados. Esto parece suceder cuando se hacen solicitudes de cantidad rápida.

¿Alguien tiene alguna idea de por qué está pasando esto?

Gracias por adelantado.

Esquema:

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; 

Dequeue:

 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 

Esto suena como una condición de carrera de algún tipo. Está utilizando MyISAM, por lo que es posible que se difiera una actualización (especialmente si hay mucho tráfico en esa tabla).

El retorno true indica que su consulta de select completó correctamente pero devolvió y vació el conjunto de resultados (sin filas). Si su lógica cuando eso sucede es esperar, digamos, 50 milisegundos, y vuelva a intentarlo, es posible que las cosas funcionen correctamente.

Editar : Puedes intentar bloquear la tabla antes de hacer la ACTUALIZACIÓN hasta que hayas hecho la última SELECCIÓN. Pero eso podría arruinar el rendimiento de otras partes de tu aplicación. Lo mejor que puedes hacer es robustecer tu aplicación frente a las condiciones de carrera.