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?
quelle
REPEATABLE READ
stattdessen,SERIALIZABLE
ob Sie sich nicht für Phantomdaten interessieren.SERIALIZABLE
ist WIRKLICH restriktiv und sollte fast nie verwendet werden (außer zum Beispiel in einigen kritischen Finanzanwendungen).WITH (NOLOCK) ist ein Hinweis auf Tabellenebene. Das Festlegen der Transaktionsisolationsstufe auf READ_UNCOMMITTED wirkt sich auf die Verbindung aus. Der Unterschied liegt im Umfang. Siehe READUNCOMMITTED und NOLOCK in der SQL Server-Dokumentation hier:
http://technet.microsoft.com/en-us/library/ms187373.aspx
Für die TRANSACTION ISOLATION LEVEL: http://technet.microsoft.com/en-us/library/ms173763.aspx
quelle
Richtlinien ... eine zufällige Suche von StackOverflow und dem elektrischen Interweb ...
quelle
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
quelle
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.
quelle
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.
quelle