J'oublierais d'essayer de verrouiller la table et/ou de le faire dans une transaction, il y a de meilleurs modèles pour cela :
- Générer un jeton unique
- Attribuez ce jeton au prochain enregistrement disponible
- Lisez quelle ligne a reçu le jeton et traitez-la
De cette façon, vous n'avez besoin d'aucun verrouillage ni transaction (car la base de données affectera votre jeton UNIQUEMENT à UN enregistrement inutilisé).
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);