Umístěte transakci kolem dvou dotazů a použijte FOR UPDATE
možnost v SELECT
dotaz k uzamčení řádků, které zkoumal. Jakékoli další připojení, které se pokusí přečíst tento řádek, bude pozastaveno, dokud nebude transakce potvrzena.
Ujistěte se, že máte index u testovaných sloupců v WHERE
klauzule, takže nebude muset skenovat a zamykat všechny řádky, které zkontroloval, než najde ten, který chcete.
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;