Zet een transactie rond de twee zoekopdrachten en gebruik de FOR UPDATE
optie in de SELECT
query om de rijen te vergrendelen die het heeft onderzocht. Elke andere verbinding die die rij probeert te lezen, wordt opgeschort totdat de transactie is doorgevoerd.
Zorg ervoor dat je een index hebt op de kolommen die je test in de WHERE
clausule, dus het hoeft geen scan uit te voeren en alle rijen te vergrendelen die het heeft gecontroleerd voordat het de gewenste vindt.
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;