Frage

Kann jemand die Auswirkungen der Verwendung erklären? with (nolock) Wann sollten Sie es bei Abfragen verwenden bzw. nicht verwenden?

Wenn Sie beispielsweise eine Bankanwendung mit hohen Transaktionsraten und vielen Daten in bestimmten Tabellen haben, für welche Arten von Abfragen wäre Nolock in Ordnung?Gibt es Fälle, in denen Sie es immer/nie verwenden sollten?

War es hilfreich?

Lösung

(NOLOCK) ist das Äquivalent von Lese Verwendung UNCOMMITED als Transaktionsisolationsstufe. So stehen Sie das Risiko einer nicht gebundenen Zeile zu lesen, die anschließend wieder aufgerollt wird, das heißt Daten, die nie in der Datenbank vorgenommen. So, während es verhindern kann, liest von anderen Operationen blockiert wird, kommt es mit einem Risiko. In einer Bankanwendung mit hohen Transaktionsraten, wird es wahrscheinlich sein wird die richtige Lösung nicht zu, was Problem Sie versuchen, IMHO mit, es zu lösen.

Andere Tipps

Die Frage ist, was noch schlimmer ist:

  • ein Deadlock oder
  • ein falscher Wert?

Für Finanzdatenbanken sind Deadlocks weit schlimmer als falscher Wert. Ich weiß, das klingt nach hinten, aber hören Sie mir. Das traditionelle Beispiel für DB Transaktionen aktualisieren Sie zwei Reihen, von einem Abzug und zum anderen hinzufügen. Das ist falsch.

In einer Finanzdatenbank verwenden Sie Geschäftsvorfälle. Das heißt, eine Zeile für jedes Konto hinzugefügt wird. Es ist von größter Wichtigkeit, dass diese Transaktionen abgeschlossen und die Reihen sind erfolgreich geschrieben.

Ankommen der Kontostand vorübergehend falsch ist keine große Sache, das ist, was das Ende des Tages Versöhnung ist für. Und ein Überziehungs von einem Konto ist viel wahrscheinlicher, auftreten, weil zwei Geldautomaten auf einmal verwendet werden, als wegen eines nicht gebundenen Lesens aus einer Datenbank.

Das heißt, SQL Server 2005 die meisten der Fehler behoben, die NOLOCK notwendig gemacht. Also, wenn Sie SQL Server 2000 oder eine frühere Version verwenden, sollten Sie es nicht benötigen.

Weiterführende Literatur
Row-Level-Versioning

Das Textbuch Beispiel für legitime Nutzung des nolock Hinweises ist Bericht Sampling gegen eine hohe Update-OLTP-Datenbank.

ein aktuelles Beispiel zu nehmen. Wenn eine große US-Bank High Street einen stündlichen Bericht auszuführen Suche nach den ersten Anzeichen einer Stadtebene Run auf die Bank wollte, konnte eine nolock Abfrage Transaktion scannen Tabellen Summieren Bareinzahlungen und Barabhebungen pro Stadt. Für einen solchen Bericht die winzigen Prozentsatz der Fehler durch gewalzten Update-Transaktionen zurück würde den Wert des Berichts nicht reduzieren.

Leider ist es nicht nur um die unbestätigten Daten zu lesen. Im Hintergrund können Sie Seiten zweimal am Ende zu lesen (im Fall einer Seitenteilung), oder Sie können die Seiten ganz verpassen. So Ihre Ergebnisse können grob verzerrt sein.

Schauen Sie sich Itzik Ben-Gan Artikel . Hier ein Auszug:

  

“Mit dem NOLOCK-Hinweis (oder Einstellung der   Isolationsstufe der Sitzung zu LESEN   UNCOMMITTED) Sie SQL Server sagen, dass   Sie erwarten nicht, Konsistenz, so dass es   keine Garantien gibt. obwohl beachten   dass „inkonsistente Daten“ nicht nur   bedeuten, dass Sie nicht gebunden sehen könnten   Änderungen, die später rückgängig gemacht wurden,   oder Datenänderungen in einem Zwischen   Zustand der Transaktion. Es ist auch   bedeutet, dass in einer einfachen Abfrage,   scannt alle Tabellen- / Indexdaten SQL Server   kann die Scan-Position verlieren, oder Sie   vielleicht am Ende die gleiche Zeile bekommen   zweimal . „

Nicht sicher, warum Sie nicht finanzielle Transaktionen in Datenbanktransaktionen werden Einwickeln (wie wenn Sie Geld von einem Konto auf ein anderes übertragen - Sie eine Seite der Transaktion nicht auf einen Zeitpunkt begehen - deshalb explizite Transaktionen existieren) . Selbst wenn Ihr Code zu Geschäftstransaktionen hirntot ist, wie es klingt, wie es ist, alle Transaktionsdatenbanken haben das Potenzial, implizite Rollbacks im Fall von Fehlern oder Versagen zu tun. Ich denke, diese Diskussion ist weit über den Kopf.

Wenn Sie Sperren Probleme haben, Versionierung implementieren und Ihren Code aufzuräumen.

Keine Sperre nicht nur gibt falsche Werte es Phantom Aufzeichnungen und Duplikate zurückgibt.

Es ist ein verbreiteter Irrtum, dass es immer schneller Abfragen ausführen macht. Wenn es keine Schreibsperren auf einer Tabelle sind, macht es keinen Unterschied machen. Wenn es Sperren auf dem Tisch liegen, kann es die Abfrage schneller machen, aber es gibt einen Grund, Schlösser in erster Linie erfunden wurden.

In der Fairness, hier sind zwei spezielle Szenarien, in denen ein nolock Hinweis Dienstprogramm bereitstellen

1) Vor 2005 SQL Server-Datenbank, die lange Abfrage für Live-OLTP-Datenbank ausgeführt werden muss dies der einzige Weg sein kann,

2) Schlecht geschriebene Anwendung, die Datensätze und kehrt sperrt an den UI-Steuerung und die Leser werden auf unbestimmte Zeit blockiert. Nolock kann hier hilfreich sein, wenn die Anwendung nicht (Dritter usw.) festgelegt werden und die Datenbank wird entweder vor 2005 oder Versionierung kann nicht eingeschaltet werden.

NOLOCK entspricht READ UNCOMMITTED, aber Microsoft sagt, dass Sie es nicht für UPDATE oder DELETE Anweisungen verwenden sollte:

  

Für UPDATE oder DELETE-Anweisungen: Dieses Feature wird in einer zukünftigen Version von Microsoft SQL Server entfernt. Vermeiden Sie diese Funktion bei neuen Entwicklungsarbeiten, und planen Sie das Ändern von Anwendungen, die derzeit diese Funktion zu nutzen.

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

Dieser Artikel bezieht sich auf SQL Server 2005, so dass die Unterstützung für NOLOCK liegt vor, wenn Sie diese Version verwenden. Um zukunftssichere Sie Code (vorausgesetzt, Sie schmutzig entschieden haben, zu verwenden, liest) Sie in Ihrer gespeicherten Prozeduren verwenden könnte:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Sie können es verwenden, wenn Sie nur Daten lesen, und Sie wirklich kümmern sich nicht darum, ob oder nicht Sie vielleicht Daten immer wieder, die noch nicht festgeschrieben wird.

Es kann auf einem Lesevorgang schneller, aber ich kann nicht wirklich sagen, um wie viel.

Generell empfehle ich es gegen die Verwendung von -. Geschriebene Daten lesen bestenfalls ein wenig verwirrend sein kann

Ein weiterer Fall, in dem es in der Regel in Ordnung ist in einer Berichtsdatenbank, wo die Daten vielleicht schon im Alter und schreiben passieren einfach nicht. In diesem Fall kann die Option sollte allerdings auf Datenbank- oder Tabellenebene vom Administrator festgelegt, indem die Standardisolationsstufe zu ändern.

Im allgemeinen Fall: Sie können es verwenden, wenn Sie sehr sicher, dass es okay ist, alte Daten zu lesen. Die wichtige Sache zu erinnern ist, dass seine sehr leicht, dass falsch zu bekommen . Zum Beispiel, auch wenn es an der Zeit, die Sie wichtiger dieses Updates, um die Abfrage zu schreiben, sind Sie sicher, etwas nicht in der Datenbank in der Zukunft ändern zu machen in Ordnung ist?

Ich werde auch 2. die Vorstellung, dass es wahrscheinlich nicht eine gute Idee, in Banking App. Oder Inventar App. Oder überall Sie denken über Transaktionen.

Einfache Antwort -., Wenn Ihre SQL keine Daten zu ändern, und Sie haben eine Abfrage, die mit anderer Aktivität stören könnte (via locking)

Es ist eine Überlegung wert, für alle Abfragen für Berichte verwendet, vor allem, wenn die Abfrage dauert als, sagen wir, 1 Sekunde.

Es ist besonders nützlich, wenn Sie OLAP-Typ Berichte haben Sie gegen eine OLTP-Datenbank ausführen.

Die erste Frage ist allerdings, „warum bin ich darüber Sorgen?“ ln meiner Erfahrung nimmt das Standardsperrverhalten fudging oft statt, wenn jemand im Modus „alles versuchen“, und dies ist ein Fall, in dem unerwartete Folgen nicht unwahrscheinlich sind. Allzu oft ist es ein Fall der vorzeitigen Optimierung und zu leicht links in einer Anwendung eingebettet bekommen kann „nur für den Fall.“ Es ist wichtig zu verstehen, warum Sie es tun, welches Problem sie löst, und ob Sie tatsächlich das Problem.

Meine 2 Cent - macht es Sinn, WITH (NOLOCK zu verwenden), wenn Sie Berichte müssen generieren. An diesem Punkt würden die Daten nicht viel ändern und Sie würde nicht wollen, diese Datensätze sperren.

Wenn Sie Finanztransaktionen sind Handling dann wollen Sie nie nolock verwenden. nolock wird am besten von großen Tabellen auszuwählen, die viele Updates und Sie sich nicht, wenn der Datensatz, den Sie möglicherweise veraltet sein kann.

Für Finanzunterlagen (und fast alle anderen Datensätze in den meisten Anwendungen) nolock wäre verheerend, wie Sie möglicherweise Daten, die aus einem Datensatz zurück konnten, die geschrieben wurde und nicht die richtigen Daten erhalten.

Ich habe eine „nächste Charge“ für Dinge abzurufen verwendet zu tun. Es ist in diesem Fall nicht egal genaue Position, die, und ich habe eine Menge von Benutzern dieselbe Abfrage ausgeführt wird.

Kurze Antwort:

Nie WITH (NOLOCK) verwenden.

Lange Antwort:

NOLOCK oft als magische Art und Weise genutzt wird, zu beschleunigen Datenbank liest, aber ich versuche mit ihm möglichst zu vermeiden.

Die Ergebnismengen Zeilen enthalten können, die noch nicht begangen worden ist, die oft später rollte zurück.

Ein Fehler oder Ergebnis-Set kann leer sein, fehlen Zeilen oder der gleichen Zeile mehrmals angezeigt werden.

Das ist, weil andere Transaktionsdaten zur gleichen Zeit bewegen Sie sie gerade lesen.

READ COMMITTED fügt ein zusätzliches Problem, bei dem Datum in einer einzelnen Spalte beschädigt ist, wo mehrere Benutzer gleichzeitig die gleiche Zelle ändern.

Es gibt noch andere Nebenwirkungen zu, die sich ergeben, in die Geschwindigkeit erhöhen, opfern Sie in erster Linie zu gewinnen hofften.

Es kann argumentiert werden, dass es in Ordnung ist es an Orten zu verwenden, wo Sie damit durchkommen können, aber was ist der Sinn? Ich kann nicht jede Situation denken, wo beschädigte Daten akzeptabel ist.

Nie verwenden NOLOCK je.

(je)

Verwenden nolock wenn Sie mit den „schmutzigen“ Daten in Ordnung sind. Was bedeutet, nolock auch Daten lesen kann, welche im Begriff ist, geändert werden kann und / oder unbestätigte Daten.

Es ist im Allgemeinen keine gute Idee, es in hohen Transaktionsumgebung zu verwenden und deshalb ist es keine Standardoption auf Abfrage ist.

Ich verwende den Hinweis „with (nolock)“ insbesondere in SQLServer 2000-Datenbanken mit hoher Aktivität.Ich bin mir jedoch nicht sicher, ob es in SQL Server 2005 benötigt wird.Ich habe diesen Hinweis kürzlich auf Anfrage des DBA des Kunden in einem SQL Server 2000 hinzugefügt, weil ihm viele SPID-Datensatzsperren aufgefallen waren.

Ich kann nur sagen, dass uns die Verwendung des Hinweises NICHT geschadet hat und dass sich das Sperrproblem offenbar von selbst gelöst hat.Der DBA dieses bestimmten Kunden bestand grundsätzlich darauf, dass wir den Hinweis verwenden.

Übrigens handelt es sich bei den Datenbanken, mit denen ich mich beschäftige, um Back-Ends für medizinische Anspruchssysteme von Unternehmen, wir sprechen also von Millionen Datensätzen und mehr als 20 Tabellen in vielen Verknüpfungen.Normalerweise füge ich für jede Tabelle im Join einen WITH-Hinweis (Nolock) hinzu (es sei denn, es handelt sich um eine abgeleitete Tabelle. In diesem Fall können Sie diesen bestimmten Hinweis nicht verwenden).

Die einfachste Antwort ist eine einfache Frage - brauchen Sie Ihre Ergebnisse wiederholbar zu sein? Wenn ja, dann NOLOCKS nicht angemessen ist unter keinen Umständen

Wenn Sie die Wiederholbarkeit nicht dann kann nolocks nützlich sein, vor allem, wenn Sie nicht die Kontrolle über alle Prozesse zur Zieldatenbank zu verbinden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top