Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

ORDRE PAR et AVEC (ROWLOCK, UPDLOCK, READPAST)

Comme prévu

  • Le SELECT avec ORDER BY, sans ROWLOCK, sans index aura un verrou de table en raison d'un balayage/tri intermédiaire pour déterminer TOP 2. Ainsi, la 2ème session ignore toute la table à cause de READPAST

  • Le SELECT sans ORDER BY ne fait que sélectionner 2 lignes quelconques, qui se trouvent être dans l'ordre d'insertion (pure coïncidence, il n'y a pas d'ordre implicite). Le fait que ces 2 lignes soient verrouillées fait sauter la 2ème session aux lignes suivantes non verrouillées.

SQL Server tente de garder les verrous aussi granulaires que possible, mais l'analyse signifie un verrou de table. Maintenant, cela ne ferait normalement pas de différence (ce serait un verrou de lecture partagé) mais vous avez aussi UPDLOCK, ce qui signifie une table exclusivement verrouillée

Donc, vous avez besoin des deux

  • 3 conseils dans les requêtes SELECT (ROWLOCK, UPDLOCK, READPAST) pour contrôler la granularité, l'isolement et la concurrence.
    L'utilisation de ROWLOCK uniquement entraînera toujours un verrou exclusif sur chaque ligne à analyser/trier.
  • un index sur Value INCLURE TestID pour rendre le SELECT efficace. Un index corrigera probablement la simultanéité, mais cela ne sera pas garanti.

Dans l'une de vos questions précédentes, j'ai lié ma réponse (dans un commentaire) à Condition de concurrence dans la file d'attente des processus SQL Server où j'ai les 3 indices de verrouillage