it-swarm.com.de

Was ist der Unterschied zwischen NOLOCK und UNCOMMITTED?

Ich benutze SQL Server 2012.

Ich schreibe zwei Abfragen, aber was ist anders zwischen NOLOCK und UnCommitted?

SELECT lastname, firstname
FROM HR.Employees with (READUNCOMMITTED)

SELECT lastname, firstname 
FROM HR.Employees with (NoLock)
36

NOLOCK: Entspricht READUNCOMMITTED (Quelle: MSDN )

NOLOCK oder READUNCOMMITTED Gibt an, dass Dirty Reads zulässig sind. Es werden keine gemeinsamen Sperren ausgegeben, um zu verhindern, dass andere Transaktionen die von der aktuellen Transaktion gelesenen Daten ändern, und durch andere Transaktionen gesetzte exklusive Sperren verhindern nicht, dass die aktuelle Transaktion die gesperrten Daten liest. Das Zulassen von Dirty Reads kann zu einer höheren Parallelität führen, allerdings auf Kosten des Lesens von Datenänderungen, die dann von anderen Transaktionen rückgängig gemacht werden

Die Hinweise READUNCOMMITTED und NOLOCK gelten nur für Datensperren. Alle Abfragen, einschließlich der with READUNCOMMITTED and NOLOCK hints, Sch-S-Sperren (Schemastabilität) während der Kompilierung und Ausführung erwerben. Aus diesem Grund werden Abfragen blockiert, wenn eine gleichzeitige Transaktion eine Sch-M-Sperre (Schemaänderung) für die Tabelle enthält

39

nter der Haube führen sie die gleiche Aktion aus.

Das read-uncommitted Isolationsstufe ist die am wenigsten einschränkende Isolationsstufe in SQL Server, weshalb sie auch bei Entwicklern beliebt ist, wenn es darum geht, das Blockieren zu reduzieren.

Der Tabellenhinweis nolock hinter den Kulissen führt genau die gleiche Aktion aus wie die Ausführung unter der Isolationsstufe "Nicht festgeschrieben".

Theeinziger Unterschied zwischen den beiden ist, dass die read-uncommitted Isolationsstufe bestimmt den Sperrmechanismus für die gesamte Verbindung und der nolock Tabellenhinweis bestimmt den Sperrmechanismus für die Tabelle, der Sie den Hinweis geben.

16
Prabu

Kein Unterschied in Bezug auf ihre Funktionen, wie andere erwähnt haben.

Der einzige Unterschied besteht darin, dass Sie WITH(NOLOCK) selektiv auf einige Tabellen anwenden können, auf andere jedoch nicht. READ UNCOMMITTED Wendet NOLOCK auf alle Tabellen in einer Sitzung an.

Wenn du das tust:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT *
FROM Table1 T1
INNER JOIN Table2 T2 ON T1.ID = T2.id

Es ist funktional äquivalent zu:

SELECT *
FROM Table1 T1 WITH(NOLOCK)
INNER JOIN Table2 T2 WITH(NOLOCK) ON T1.ID = T2.ID

Sie können WITH(NOLOCK) aber auch selektiv anwenden:

SELECT *
FROM Table1 T1 WITH(TABLOCK)
INNER JOIN Table2 WITH(NOLOCK) ON T1.ID = T2.ID
14
Code Different

Auf Anweisungsebene gibt es keinen Unterschied.

Sie können READUNCOMMITED auf Sitzungsebene einstellen und müssen hier SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED schreiben

7
CPMunich

Für NOLOCK müssen wir diesen Hinweis auf Tabellenebene setzen, daher müssen wir ihn für jede Tabellenebene setzen, die in der Aktualisierungstransaktion verwendet wird. Daher ist es sehr langwierig und zeitaufwendig, sie überall dort abzulegen, wo Tabellen in Abfragen verwendet werden. Für READ UNCOMMITTED müssen wir es nicht auf jeder Tabellenebene ablegen, sondern müssen es nur auf Sitzungsebene oder Abfrageebene ablegen und können oben auf die Abfrage oder gespeicherte Prozedur geschrieben werden. Schauen wir uns eine kleine Demo an, um sie näher zu erläutern. Überprüfen Sie zuerst hier die Standardisolationsstufe der Datenbank

CREATE TABLE SAMPLETABLE
(
Col1 INT ,
Col2 VARCHAR(100)
)

INSERT INTO SAMPLETABLE(Col1,Col2)
SELECT 1,'Col1'
Union all
SELECT 2,'Col1'

BEGIN TRANSACTION 

Update SAMPLETABLE Set Col2 = 'Value changed' Where col1 =1

Select * from SAMPLETABLE with (nolock)



SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Select * from SAMPLETABLE 

Die Ausgabe ist 1, Col1 für beide Abfragen

1
M Prabhu