web-dev-qa-db-fra.com

Une simple requête de sélection acquiert-elle des verrous?

Je suis très nouveau sur SQL Server et j'aimerais comprendre si la très simple instruction select suivante prendrait des verrous.

Select * from Student;

Veuillez considérer le cas où l'instruction ne s'exécuterait pas dans un begin tran bloquer.

14
New Developer

Oui, il prend un verrou partagé sur les lignes qu'il lit par défaut (il prend également un verrou partagé intentionnel sur toutes les pages de l'index cluster qu'il lira), cela est fait pour éviter les lectures sales. Cependant, il existe des moyens de contourner cela (SQL Server a l'indication nolock). Si l'instruction n'est pas dans un BEGIN TRAN, le verrou est libéré après l'exécution de l'instruction SELECT.

Plus d'informations peuvent être trouvées ici:

http://msdn.Microsoft.com/en-us/library/ms184286 (v = sql.105) .aspxhttp://www.sqlteam.com/article/introduction -à-verrouillage-dans-serveur-sql

5
WrinkleFree

Je voudrais comprendre si l'instruction select très simple suivante prendrait des verrous

C'est une idée fausse commune qu'une SELECT requête s'exécutant par défaut READ COMMITTED le niveau d'isolement des transactions prendra toujours des verrous partagés pour éviter les lectures incorrectes.

SQL Server peut éviter de prendre des verrous partagés au niveau de la ligne lorsqu'il n'y a aucun danger de lire des données non validées sans eux (bien que des verrous d'intention partagée (IS) de niveau supérieur soient toujours pris).

Même si les verrous de ligne partagés sont pris (peut-être parce qu'une autre transaction simultanée a modifié la page sur laquelle la ligne se trouve), ils peuvent être libérés bien avant la fin de l'instruction SELECT.

Dans la plupart des cas, la ligne est "déverrouillée" juste avant que le serveur traite la ligne suivante. Dans certains cas, les verrous partagés pris au niveau d'isolement par défaut sont conservés jusqu'à la fin de l'instruction en cours, mais pas jusqu'à la fin de la transaction .

Remplacer le niveau d'isolement actuel avec l'indicateur de table NOLOCK est presque toujours une mauvaise idée .

Le verrouillage est un détail d'implémentation. SQL Server prend des verrous lorsque cela est nécessaire pour garantir qu'il respecte les garanties sémantiques fournies par le courant niveau d'isolement . Il y a certainement des moments où il est utile de savoir un peu pourquoi les verrous sont pris, mais tenter de les prévoir est très souvent contre-productif.

SQL Server fournit une grande variété de niveaux d'isolement; choisissez celui qui offre les garanties et les comportements dont vos clients ont besoin.

26
Paul White 9