Dimenticherei di provare a bloccare il tavolo e/o farlo in una transazione, c'è un modello migliore per questo:
- Genera un token univoco
- Assegna quel token al successivo record disponibile
- Leggi quale riga ha ricevuto il token ed elaboralo
In questo modo non hai bisogno di alcun blocco e transazione (perché il DB assegnerà il tuo token SOLO a UN record inutilizzato).
Pseudo-codice:
$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);