Ich denke, es ist unter bestimmten Umständen in Ordnung , solange Sie die Konsequenzen akzeptieren und keine anderen Optionen haben.
Für andere Optionen würde ich die Leute dazu drängen, Read Committed Snapshot Isolation (RCSI) für neue Anwendungen oder SNAPSHOT ISOLATION (SI) für ältere Anwendungen zu verwenden, bei denen Sie mit RCSI nicht einfach die gesamte Codebasis auf Rennbedingungen testen können.
Diese passen jedoch möglicherweise nicht gut zusammen. Möglicherweise müssen Sie zusätzliche Zeit damit verbringen, Tempdb zu lieben und zu pflegen, und sicherstellen, dass niemand eine offene Transaktion hinterlässt, durch die der Versionsspeicher (und Tempdb) wachsen und die Festplatte füllen.
Wenn Sie keinen DBA haben oder jemanden, dessen Aufgabe es ist, Ihren SQL Server zu überwachen und zu verwalten, können diese Optionen gefährlich sein. Im Allgemeinen hat nicht jeder die volle Kontrolle über den Code, der an seinen Server gesendet wird, wo er die Verbindungszeichenfolge oder den Code ändern kann, um nach SI für Problemabfragen zu fragen.
Außerdem haben die meisten Benutzer keine Sperrprobleme mit ihrer gesamten Anwendung . Sie haben Probleme mit der Berichterstellung über OLTP-Daten. Wenn Sie die Kompromisse von NOLOCK / RU im Austausch für Berichte akzeptieren können, die nicht von Autoren blockiert wurden, entscheiden Sie sich dafür.
Stellen Sie einfach sicher, dass Sie verstehen, was das bedeutet. Dies bedeutet nicht, dass Ihre Abfrage keine Sperren akzeptiert, sondern dass die von anderen Abfragen aufgehobenen Sperren nicht berücksichtigt werden.
Und natürlich, wenn Ihr Problem das Sperren von Writern / Writern ist, ist die einzige Option, die helfen wird, SI, aber es würde unglaublich viel Entwicklerarbeit erfordern, um dies mit Fehlerbehandlung usw. richtig zu implementieren.
IMHO ist der einzige gültige Anwendungsfall für READ UNCOMMITTED auf einem modernen System das Debuggen einer Sitzung von einer anderen in der Entwicklung, sodass Sie sehen können, was es tut, während z. B. ein gespeicherter Prozess noch ausgeführt wird. Es würde normalerweise niemals in einem Produktionssystem verwendet werden. Es mag einen kleinen Leistungsgewinn geben, aber auf lange Sicht wird es sich nie lohnen.
quelle
Wir verwenden es ständig im Gesundheitswesen.
Es ist erstaunlich selten, dass sich einzelne Datenzeilen während der Abfrage ändern, und das Lese- / Schreibverhältnis liegt bei 10.000 / 1 - und die meisten davon sind Einfügungen, keine Aktualisierungen. Wenn die Laborschnittstelle beispielsweise die Laborergebnisse eines Patienten in die Datenbank schreibt, werden sich diese Werte niemals ändern.
Wenn Daten tun ändern, ändert es eine Zeile zu einem Zeitpunkt. Niemand aktualisiert ganze Spalten (außer einem DBA, wenn sie wirklich schlecht sind).
Auf der anderen Seite führen wir eine Reihe von Abfragen durch, um nach Dingen wie Patienten zu suchen, die innerhalb von 72 Stunden oder weniger in die Notaufnahme zurückkehren, was die Tabellen absolut hämmert.
In 10 Jahren SQL im Gesundheitswesen habe ich noch nie einen gesehen
Rollback Transaction
. Ich möchte ein- und aussteigen, ohne die Endbenutzererfahrung zu beeinträchtigen. Wenn es ein hohes Risiko gibt, die OLTP-Datenbank zu verlangsamen, und ein geringes Risiko, schlechte Daten zu erhalten, werde ich NOLOCK.Sollen wir es benutzen? Vielleicht, vielleicht nicht. Im Allgemeinen würde ich nicht sagen, dass viele der Anwendungsdatenbanken, an denen ich gearbeitet habe, gut gestaltet sind. Sie sind normalerweise voller Anti-Muster.
quelle
READ_UNCOMMITTED/NOLOCK
ist eine gute Option, wenn die Genauigkeit der Daten nicht wirklich das Hauptziel ist. Manchmal, wenn nur eine ungefähre Gesamtanzahl erforderlich ist. Zum Beispiel: Es gibt gespeicherte Prozeduren, mit denen entweder INSERT- oder UPDATE-Tabellen erstellt werden. Manchmal ist die Anzahl der zu aktualisierenden oder einzufügenden Datensätze sehr groß (Tausende von Datensätzen). Während dieser gespeicherten Prozedur ausgeführt wird , wir eine einfache Auswahlabfrage mit ausführen könnenNOLOCK
auf der Zieltabelle in regelmäßigen Abständen , um zu sehen , ob es reibungslos fortschreitet (Für eine Update - Abfrage, wenn Sie eine Statusänderung Spalte für Datensätze aktualisiert werden können wir diese Spalte verwenden ausführengroup by
Abfrage mitNOLOCK
um festzustellen, ob sich die Anzahl der Statusänderungen ständig ändert).quelle
Beachten Sie, dass READ UNCOMMITTED zusätzliche Konsistenzprobleme mit sich bringt, nicht nur Dirty Reads. Abhängig von der Zugriffsmethode können Sie Zeilen verpassen oder sogar dieselbe Zeile mehrmals lesen. Wenn Sie an den Details interessiert sind, lesen Sie den Artikel von Itzik Ben-Gan
quelle