Zapomněl bych pokusit se zamknout stůl a/nebo to udělat v transakci, na to existují lepší vzory:
- Vygenerujte jedinečný token
- Přiřaďte tento token k dalšímu dostupnému záznamu
- Přečtěte si, který řádek token získal, a zpracujte jej
Tímto způsobem nepotřebujete vůbec žádné zamykání a transakce (protože DB přiřadí váš token POUZE JEDNOMU nepoužitému záznamu).
Pseudokód:
$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);