Jag skulle glömma att försöka låsa bordet och/eller göra det i en transaktion, det finns bättre mönster för detta:
- Generera en unik token
- Tilldela den token till nästa tillgängliga post
- Läs vilken rad som fick token och bearbeta den
På så sätt behöver du inga låsningar och transaktioner alls (eftersom DB tilldelar din token ENDAST EN oanvänd post).
Pseudokod:
$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);