To, co musisz zrobić, to dodać tutaj jakiś rodzaj blokady, aby zapobiec warunkom wyścigu, takim jak ten, który stworzyłeś:
UPDATE persons SET processing=1 WHERE id=:id AND processing=0
Pozwoli to uniknąć podwójnego zablokowania.
Aby jeszcze bardziej to poprawić, utwórz kolumnę blokady, której możesz użyć do zgłaszania roszczeń:
UPDATE persons
SET processing=:processing_uuid
WHERE processing IS NULL
LIMIT 1
Wymaga to VARCHAR
, zindeksowane processing
kolumna używana do zgłaszania roszczeń, która ma wartość domyślną NULL
. Jeśli zmodyfikujesz wiersz w wynikach, zarejestrowałeś rekord i możesz z nim pracować, używając:
SELECT * FROM persons WHERE processing=:processing_uuid
Za każdym razem, gdy próbujesz zgłosić roszczenie, wygeneruj nowy klucz UUID roszczenia.