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;