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.