Jeg ville glemme at prøve at låse bordet og/eller gøre det i en transaktion, der er bedre mønstre for dette:
- Generer et unikt token
- Tildel det token til den næste tilgængelige post
- Læs, hvilken række der fik tokenet, og bearbejd det
På den måde behøver du ingen låsning og transaktioner overhovedet (fordi DB'en KUN tildeler dit token til EN ubrugt post).
Pseudo-kode:
$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);