Zapomniałbym spróbować zablokować tabelę i/lub zrobić to w transakcji, są na to lepsze wzorce:
- Wygeneruj unikalny token
- Przypisz ten token do następnego dostępnego rekordu
- Przeczytaj, który wiersz otrzymał token i przetwórz go
W ten sposób nie potrzebujesz żadnych blokad ani transakcji (ponieważ DB przypisze Twój token TYLKO do JEDNEGO nieużywanego rekordu).
Pseudo-kod:
$token = time(); //Only you have very low concurrency. Otherwise use something more unique, like a GUID or an identity value from a tokens table.
EXEC SQL: "UPDATE mytable SET token = $token WHERE token IS NULL LIMIT 1"
EXEC SQL: "SELECT id FROM mytable WHERE token = $token"
process($id);