2017-12-12 1 views
2

Ich versuche, einige Abfragen zu schreiben, um Daten aus der Datenbank abzurufen. Ich habe With (NoLock) verwendet, um zu verhindern, dass SQL Server freigegebene Sperren für die Datenbank platziert. Und vor kurzem hat mir ein Freund gesagt, dass das Standardverhalten jetzt ist, dass es keine Lesesperren mehr speichert.Sollte ich noch With (NoLock) in SQL Server-Abfragen verwenden?

Allerdings kann ich keine saubere Erklärung dafür finden. Sollte ich noch mit (NoLock) in SQL Server verwenden?

+2

Wahrscheinlich bitten Sie Ihren Freund, Sie auf einige Artikel als Beweis zu verweisen. – Sunil

+1

Dies ist nur das Standardverhalten, wenn Sie RCSI aktivieren (das ist nicht der Standard außer bei Azure), aber Sie sollten 'With (NoLock)' routinemäßig nicht verwenden. –

Antwort

3

WITH (NOLOCK) verhält sich genauso wie die Einstellung der Transaktionsisolationsstufe auf READ UNCOMMITTED, nur der Umfang ist anders.

Beachten Sie jedoch, dass SQL Server je nach Art der ausgeführten Abfrage eine andere Isolationsstufe verwenden kann. (INSERT, UPDATE, DELETE und andere Schreiboperationen müssen unter mindestens READ COMMITTED laufen).

Ihr Freund ist nicht richtig, SQL Server wird mindestens eine Schema-Sperre während Leseoperationen für die Tabelle erwerben, um Änderungen in der Struktur der Tabelle zu verhindern. Diese Sperre wird auch dann auf die Tabelle angewendet, wenn Sie die Isolationsstufe READ UNCOMMITTED oder den Hinweis WITH (NOLOCK) verwenden.

Im Allgemeinen würde ich vermeiden, den WITH (NOLOCK) Hinweis zu verwenden. Sie haben weniger Kontrolle, wenn Sie den Tabellenhinweis verwenden. Verwenden Sie die Isolationsstufe READ UNCOMMITTED für die Verbindung, wenn fehlerhafte Lesevorgänge zulässig sind. Sie können die Isolationsstufe der Verbindung immer ändern, aber Sie können den WITH (NOLOCK) Hinweis nicht dynamisch entfernen. Dies gilt insbesondere, wenn Sie WITH (NOLOCK) für jede Tabelle verwenden.

+3

'WITH (NOLOCK)' ist nicht veraltet für SELECT-Abfragen. IMO der Tabellenhinweis gibt Ihnen * mehr * Kontrolle, weil es auf die spezifische Tabelle ausgerichtet ist und nicht für jede Tabelle in jeder Anweisung gilt. –

+0

In diesem Sinne haben Sie recht, Sie können es in eine Tabelle umwandeln, aber Sie können es nicht einfach ändern, wenn es benötigt wird. Und wenn Sie es für alle Tabellen verwenden, sehe ich den Punkt nicht, Sie können einfach die Isolationsstufe ändern. Ich würde es vermeiden, es zu benutzen, aber ja, manchmal ist es notwendig. – Pred

+0

Und ja, Sie haben recht, 'WITH (NOLOCK)' ist nicht nur die Tabellenhinweise ohne das Schlüsselwort 'WITH' veraltet. Meine Schuld, von der Antwort entfernt – Pred

0

ich in Microsoft-Dokumentation löschen Sie die folgende Anweisung, die NOLOCK und READUNCOMMITTED Hinweise zu verwenden, warnt in Abfrage

Hinweis: Unterstützung für die Verwendung der READUNCOMMITTED und NOLOCK Hinweise in der FROM-Klausel, die für die Zieltabelle einer UPDATE oder DELETE-Anweisung gelten in einer zukünftigen Version von SQL Server entfernt werden. Vermeiden Sie die Verwendung dieser Hinweise in diesem Kontext bei neuen Entwicklungsarbeiten, und planen Sie, Anwendungen zu ändern, die sie derzeit verwenden.

Weitere Informationen finden Sie in der Dokumentation unter dem Link https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table. Es wird nicht erwähnt, dass es sich um das Standardverhalten handelt.

+0

OP fragt nach Daten nur abholen, die ziemlich häufig 'mit (Nolock)' Hinweis mit Select-Anweisungen verwenden. Die Warnung, auf die Sie verwiesen haben, bezieht sich jedoch nur auf 'update'- und' delete'-Anweisungen. – ibubi

Verwandte Themen