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

Comprendre SQL Server LOCKS sur les requêtes SELECT

Un SELECT dans SQL Server placera un verrou partagé sur une ligne du tableau - et un second SELECT nécessiterait également un verrou partagé, et ceux-ci sont compatibles les uns avec les autres.

Donc personne - un SELECT impossible de bloquer un autre SELECT .

Qu'est-ce que le WITH (NOLOCK) L'indicateur de requête est utilisé pour pouvoir lire les données en cours d'insertion (par une autre connexion) et qui n'ont pas encore été validées.

Sans cet indice de requête, un SELECT peut être bloqué la lecture d'une table par un INSERT en cours (ou UPDATE ) qui place une instruction exclusive verrouiller des lignes (ou éventuellement une table entière), jusqu'à ce que la transaction de cette opération ait été validée (ou annulée).

Problème du WITH (NOLOCK) indice est :vous lisez peut-être des lignes de données qui ne seront pas insérées du tout, à la fin (si le INSERT la transaction est annulée) - ainsi votre par ex. rapport peut afficher des données qui n'ont jamais vraiment été validées dans la base de données.

Il y a un autre indice de requête qui pourrait être utile - WITH (READPAST) . Ceci indique au SELECT commande pour ignorer toutes les lignes qu'elle tente de lire et qui sont verrouillées en mode exclusif. Le SELECT ne bloquera pas, et il ne lira pas les données non validées "sales" - mais il pourrait sauter certaines lignes, par ex. ne pas afficher toutes vos lignes dans le tableau.