Ik zou vergeten de tafel te vergrendelen en/of het in een transactie te doen, hier zijn betere patronen voor:
- Genereer een unieke token
- Wijs dat token toe aan het volgende beschikbare record
- Lees welke rij het token heeft gekregen en verwerk het
Op die manier heeft u helemaal geen vergrendeling en transacties nodig (omdat de DB uw token SLECHTS aan EEN ongebruikte record zal toewijzen).
Pseudo-code:
$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);