Suche…


Syntax

  • SET TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | LESEN BESTIMMT | Wiederholbares Lesen | SNAPSHOT | SERIALIZABLE} [; ]

Bemerkungen

MSDN-Referenz: SET TRANSACTION ISOLATION LEVEL

Lesen Sie unverbindlich

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Dies ist die am meisten zulässige Isolationsstufe, da sie keinerlei Sperren verursacht. Sie gibt an, dass Anweisungen alle Zeilen lesen können, einschließlich Zeilen, die in Transaktionen geschrieben wurden, aber noch nicht festgeschrieben sind (dh sie befinden sich noch in der Transaktion). Diese Isolationsstufe kann "Dirty Reads" unterliegen.

Lesen Sie Committed

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

Diese Isolationsstufe ist die zweithöchste. Es verhindert schmutziges Lesen. Das Verhalten von READ COMMITTED hängt von der Einstellung von READ_COMMITTED_SNAPSHOT :

  • Wenn die Einstellung auf OFF (Standardeinstellung) gesetzt ist, verwendet die Transaktion gemeinsame Sperren, um zu verhindern, dass andere Transaktionen die von der aktuellen Transaktion verwendeten Zeilen ändern. Außerdem wird die aktuelle Transaktion daran gehindert, von anderen Transaktionen modifizierte Zeilen zu lesen.

  • Wenn diese READCOMMITTEDLOCK auf ON gesetzt ist, kann der READCOMMITTEDLOCK Tabellenhinweis verwendet werden, um anstelle der Zeilenversionierung für Transaktionen, die im Modus READ COMMITTED werden, gemeinsames Sperren anzufordern.

Hinweis: READ COMMITTED ist das Standardverhalten von SQL Server.

Was sind "Dirty Reads"?

Schmutzige Lesevorgänge (oder nicht festgeschriebene Lesevorgänge) sind Lesevorgänge von Zeilen, die von einer offenen Transaktion geändert werden.

Dieses Verhalten kann mithilfe von zwei separaten Abfragen repliziert werden: eine, um eine Transaktion zu öffnen und einige Daten in eine Tabelle zu schreiben, ohne zu verpflichten.

Abfrage 1 - Bereiten Sie eine Transaktion vor, aber beenden Sie sie nicht:

CREATE TABLE dbo.demo (
    col1 INT,
    col2 VARCHAR(255)
);
GO
--This row will get committed normally:
BEGIN TRANSACTION;
    INSERT INTO dbo.demo(col1, col2) 
    VALUES (99, 'Normal transaction');
COMMIT TRANSACTION;
--This row will be "stuck" in an open transaction, causing a dirty read
BEGIN TRANSACTION;
    INSERT INTO dbo.demo(col1, col2) 
    VALUES (42, 'Dirty read');
--Do not COMMIT TRANSACTION or ROLLBACK TRANSACTION here

Abfrage 2 - Lesen Sie die Zeilen einschließlich der offenen Transaktion:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM dbo.demo;

Kehrt zurück:

col1        col2
----------- ---------------------------------------
99          Normal transaction
42          Dirty read

PS: Vergessen Sie nicht, diese Demo-Daten aufzuräumen:

COMMIT TRANSACTION;
DROP TABLE dbo.demo;
GO

Wiederholbares Lesen

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

Diese Transaktionsisolationsstufe ist etwas weniger zulässig als READ COMMITTED , da gemeinsam genutzte Sperren für alle von jeder Anweisung in der Transaktion gelesenen Daten gesetzt und bis zum Abschluss der Transaktion gehalten werden, anstatt nach jeder Anweisung freigegeben zu werden.

Anmerkung: Verwenden Sie diese Option nur, wenn dies erforderlich ist, da dies eher zu einer Beeinträchtigung der Datenbankleistung und zu Deadlocks als zu READ COMMITTED .

Schnappschuss

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL SNAPSHOT

Gibt an, dass Daten, die von einer Anweisung in einer Transaktion gelesen werden, die transaktionskonsistente Version der Daten sind, die zu Beginn der Transaktion vorhanden waren, dh, dass nur Daten gelesen werden, die vor dem Beginn der Transaktion festgeschrieben wurden.

SNAPSHOT Transaktionen fordern keine Sperren für die gelesenen Daten an und verursachen keine Sperren, da sie nur die Version (oder Momentaufnahme) der Daten lesen, die zum Zeitpunkt des Transaktionsbeginns vorhanden waren.

Eine Transaktion, die in der SNAPSHOT Isolationsstufe ausgeführt wird, liest nur ihre eigenen Datenänderungen, während sie ausgeführt wird. Eine Transaktion könnte beispielsweise einige Zeilen aktualisieren und dann die aktualisierten Zeilen lesen. Diese Änderung ist jedoch nur für die aktuelle Transaktion sichtbar, bis sie festgeschrieben wird.


Anmerkung: Die Datenbankoption ALLOW_SNAPSHOT_ISOLATION muss auf ON gesetzt sein, bevor die Isolationsstufe SNAPSHOT verwendet werden kann.

Serialisierbar

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL SERIALIZEABLE

Diese Isolationsstufe ist am restriktivsten. Er fordert Bereichssperren an, die den Bereich der Schlüsselwerte sperren, die von jeder Anweisung in der Transaktion gelesen werden. Dies bedeutet auch, dass INSERT Anweisungen aus anderen Transaktionen gesperrt werden, wenn die einzufügenden Zeilen in dem von der aktuellen Transaktion gesperrten Bereich liegen.

Diese Option hat den gleichen Effekt wie das Festlegen von HOLDLOCK für alle Tabellen in allen SELECT Anweisungen in einer Transaktion.


Hinweis: Diese Transaktionsisolation hat die geringste Parallelität und sollte nur bei Bedarf verwendet werden.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow