Umieść transakcję wokół dwóch zapytań i użyj FOR UPDATE
opcja w SELECT
zapytanie, aby zablokować sprawdzane wiersze. Każde inne połączenie, które spróbuje odczytać ten wiersz, zostanie zawieszone do czasu zatwierdzenia transakcji.
Upewnij się, że masz indeks kolumn, które testujesz w WHERE
, więc nie będzie musiał skanować i blokować wszystkich sprawdzonych wierszy przed znalezieniem tego, który chcesz.
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;