Avec (NOLOCK) vs niveau D'isolement de la TRANSACTION défini lire non engagé

Quelqu'un pourrait-il me donner quelques conseils sur le moment où je devrais utiliser WITH (NOLOCK) par opposition à SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Quels sont les avantages et les inconvénients de chacun? Y a-t-il des conséquences involontaires que vous avez rencontrées en utilisant l'un par opposition à l'autre?

111
demandé sur Ed Harper 2010-08-23 22:05:07

6 réponses

Ils sont la même chose. Si vous utilisez le set transaction isolation level déclaration, elle s'appliquera à toutes les tables de la connexion, donc si vous voulez seulement un nolock sur une ou deux tables de l'utiliser; sinon, utilisez l'autre.

les deux vous donneront des lectures obscènes. Si vous êtes d'accord avec ça, puis utilisez-les. Si vous ne pouvez pas avoir des lectures obscures, alors considérez snapshot ou serializable Conseils à la place.

94
répondu HLGEM 2014-04-24 14:42:54

avec (NOLOCK) est un indice au niveau de la table. Définir le niveau d'isolation de la transaction à READ_UNCOMMITTED avec affecte la connexion. La différence est au niveau de sa portée. Voir READUNCOMMITTED et NOLOCK dans la documentation du serveur SQL ici:

http://technet.microsoft.com/en-us/library/ms187373.aspx

pour le niveau D'isolement de la TRANSACTION: http://technet.microsoft.com/en-us/library/ms173763.aspx

23
répondu Anon246 2010-08-23 18:11:00
  • NOLOCK est local à la table (ou de points de vue, etc)
  • lire si non engagé par session/connexion

Comme pour les lignes directrices... une recherche au hasard dans StackOverflow et l'interweb électrique...

9
répondu gbn 2017-05-23 12:17:40

à ma connaissance, la seule différence est l'ampleur des effets, comme Strommy L'a dit. NOLOCK indication sur une table et la lecture non engagé sur la session.

en ce qui concerne les problèmes qui peuvent se produire, il s'agit de cohérence. Si vous vous souciez alors être conscient que vous pourriez obtenir ce qu'on appelle des lectures sales qui pourraient influencer d'autres données étant manipulées sur l'information incorrecte.

personnellement, je ne pense pas avoir vu de problèmes à partir de cela, mais cela peut être plus en raison de la façon dont j'utilise nolock. Vous devez être conscient qu'il ya des scénarios où il sera acceptable d'utiliser. Scénarios où vous ajoutez principalement de nouvelles données à une table, mais avez un autre processus qui vient derrière pour vérifier un scénario de données. Ce sera probablement correct puisque le flux principal n'inclut pas de revenir en arrière et de mettre à jour les lignes lors d'une lecture.

aussi je crois que ces jours-ci vous devriez regarder dans le contrôle de la concurrence multi-version. Je crois qu'ils ajouté en 2005 et il permet d'arrêter les auteurs de bloquer les lecteurs en donnant aux lecteurs un aperçu de la base de données à utiliser. Je vais inclure un lien et laisser d'autres recherches au lecteur:

MVCC

Base De Données Des Niveaux D'Isolement

8
répondu Sean Copenhaver 2010-08-23 18:20:38

vous ne pouvez pas utiliser le niveau D'isolement de Transaction défini lu Non engagé dans une vue (vous ne pouvez avoir qu'un seul script là-dedans en fait), donc vous devriez utiliser (nolock) si les lignes sales doivent être incluses.

4
répondu Rez.Net 2013-02-19 06:02:52

comme vous devez utiliser avec (NOLOCK) pour chaque table, il peut être ennuyeux de l'écrire dans chaque de ou jointure clause. Cependant, il a une raison pour laquelle il est appelé un "sale" lire. Donc, vous devriez vraiment savoir lorsque vous effectuez l'une, et pas la définir comme valeur par défaut pour la session. Pourquoi?

L'oubli D'un avec (NOLOCK) pourrait ne pas affecter votre programme d'une manière très dramatique, mais faire une sale lecture où vous faites pas voulez que l'on peut faire la différence dans certaines circonstances.

utilisez donc (NOLOCK) si les données actuelles sélectionnées sont incorrectes, car elles pourraient être retranchées plus tard. Cela est principalement utilisé lorsque vous voulez augmenter les performances, et les exigences sur le contexte de votre application lui permettent de prendre le risque que des données incohérentes est affiché. Cependant, vous ou quelqu'un en charge doit peser le pour et le contre de la décision d'utiliser avec (NOLOCK).

3
répondu Alex 2010-08-23 19:26:57