Coloque una transacción alrededor de las dos consultas y use FOR UPDATE opción en el SELECT consulta para bloquear las filas que examinó. Cualquier otra conexión que intente leer esa fila se suspenderá hasta que se confirme la transacción.
Asegúrese de tener un índice en las columnas que prueba en WHERE cláusula, por lo que no tendrá que hacer un escaneo y bloquear todas las filas que verificó antes de encontrar la que desea.
START TRANSACTION;
SELECT @id := `id`,`item`
FROM `queue_items`
WHERE `processed_at` IS NULL AND `completed_at` IS NULL
ORDER BY `id` ASC
LIMIT 1
FOR UPDATE;
UPDATE `queue_items` SET `processed_at` = @processedAt WHERE `id` = @id
COMMIT;