Metti una transazione attorno alle due query e usa il FOR UPDATE opzione nel SELECT query per bloccare le righe esaminate. Qualsiasi altra connessione che tenti di leggere quella riga sarà sospesa fino al commit della transazione.
Assicurati di avere un indice sulle colonne che testi in WHERE clausola, quindi non dovrà eseguire una scansione e bloccare tutte le righe che ha controllato prima di trovare quella desiderata.
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;