WITH (NOLOCK) vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

118

Könnte mir jemand eine Anleitung geben, wann ich WITH (NOLOCK)im Gegensatz zu verwenden sollteSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Was sind die Vor- und Nachteile von jedem? Gibt es irgendwelche unbeabsichtigten Konsequenzen, auf die Sie gestoßen sind, wenn Sie eine im Gegensatz zur anderen verwenden?

Jim B.
quelle

Antworten:

105

Sie sind das gleiche. Wenn Sie die set transaction isolation levelAnweisung verwenden, gilt sie für alle Tabellen in der Verbindung. Wenn Sie also nur nolockeine oder zwei Tabellen verwenden möchten, verwenden Sie diese. Andernfalls verwenden Sie den anderen.

Beide geben Ihnen schmutzige Lesungen. Wenn Sie damit einverstanden sind, verwenden Sie sie. Wenn Sie keine Dirty Reads haben können, sollten Sie stattdessen überlegen snapshotoder serializableHinweise geben.

HLGEM
quelle
Überlegen Sie REPEATABLE READstattdessen, SERIALIZABLEob Sie sich nicht für Phantomdaten interessieren. SERIALIZABLEist WIRKLICH restriktiv und sollte fast nie verwendet werden (außer zum Beispiel in einigen kritischen Finanzanwendungen).
Kryptos
10
  • NOLOCK ist lokal für die Tabelle (oder Ansichten usw.)
  • READ UNCOMMITTED ist pro Sitzung / Verbindung

Richtlinien ... eine zufällige Suche von StackOverflow und dem elektrischen Interweb ...

gbn
quelle
Der letzte Link "Warum die Verwendung von NOLOCK schlecht ist .." existiert nicht mehr.
Sangam
1
Elektro-Interweb ist von unschätzbarem Wert. Danke, dass du meinem Tag etwas Sonnenschein hinzugefügt hast.
JJS
9

Meines Wissens ist der einzige Unterschied der Umfang der Auswirkungen, wie Strommy sagte. NOLOCK-Hinweis auf eine Tabelle und READ UNCOMMITTED in der Sitzung.

Bei Problemen, die auftreten können, dreht sich alles um Konsistenz. Wenn Sie sich darum kümmern, sollten Sie sich darüber im Klaren sein, dass Sie sogenannte Dirty Reads erhalten können, die andere Daten beeinflussen können, die aufgrund falscher Informationen manipuliert werden.

Ich persönlich glaube nicht, dass ich irgendwelche Probleme damit gesehen habe, aber das kann eher daran liegen, wie ich Nolock benutze. Sie müssen sich bewusst sein, dass es Szenarien gibt, in denen die Verwendung in Ordnung ist. Szenarien, in denen Sie meistens neue Daten zu einer Tabelle hinzufügen, aber einen anderen Prozess hinter sich haben, um nach einem Datenszenario zu suchen. Das wird wahrscheinlich in Ordnung sein, da der Hauptfluss nicht das Zurückgehen und Aktualisieren von Zeilen während eines Lesevorgangs umfasst.

Ich glaube auch, dass Sie sich heutzutage mit der Parallelitätskontrolle für mehrere Versionen befassen sollten. Ich glaube, sie haben es 2005 hinzugefügt und es hilft den Autoren, Leser nicht zu blockieren, indem es den Lesern einen Schnappschuss der zu verwendenden Datenbank gibt. Ich werde einen Link einfügen und dem Leser weitere Nachforschungen überlassen:

MVCC

Datenbankisolationsstufen

Sean Copenhaver
quelle
+1 Obwohl ich nicht auf den "Solltest du" -Aspekt von READ_UNCOMMITTED eingegangen bin, behandelt Sean dies gut. Es gibt auch Fälle, in denen Sie dieselbe Zeile in SQL Server zweimal lesen können (aufgrund von
Seitenteilung
6

Sie können Set Transaction Isolation Level Read nicht in einer Ansicht nicht festgeschrieben verwenden (Sie können tatsächlich nur ein Skript darin haben), daher müssten Sie (nolock) verwenden, wenn schmutzige Zeilen enthalten sein sollen.

Rez.Net
quelle
4

Da Sie WITH (NOLOCK) für jede Tabelle verwenden müssen, kann es ärgerlich sein, sie in jede FROM- oder JOIN-Klausel zu schreiben. Es hat jedoch einen Grund, warum es als "schmutziges" Lesen bezeichnet wird. Sie sollten also wirklich wissen, wann Sie eine ausführen, und sie nicht als Standard für den Sitzungsbereich festlegen. Warum?

Vergessen eines WITH (NOLOCK) möglicherweise nicht das Programm in eine sehr dramatischen Art und Weise beeinflussen, aber ein schmutzig tun lesen , in dem Sie nicht wollen man den Unterschied unter bestimmten Umständen machen.

Verwenden Sie daher WITH (NOLOCK), wenn die aktuell ausgewählten Daten falsch sein dürfen, da sie möglicherweise später zurückgesetzt werden. Dies wird hauptsächlich verwendet, wenn Sie die Leistung steigern möchten. Aufgrund der Anforderungen an Ihren Anwendungskontext besteht das Risiko, dass inkonsistente Daten angezeigt werden. Sie oder eine verantwortliche Person müssen jedoch die Vor- und Nachteile der Entscheidung für die Verwendung von WITH (NOLOCK) abwägen.

Alex
quelle