Lägg en transaktion runt de två frågorna och använd SELECT
fråga för att låsa raderna som den undersökte. Alla andra anslutningar som försöker läsa den raden kommer att stängas av tills transaktionen har genomförts.
Se till att du har ett index på kolumnerna du testar i WHERE
klausul, så den behöver inte göra en skanning och låsa alla rader den kontrollerade innan den hittade den du vill ha.
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;