Microsoft SQL Server
Transaktionsisolationsstufen
Suche…
Syntax
- SET TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | LESEN BESTIMMT | Wiederholbares Lesen | SNAPSHOT | SERIALIZABLE} [; ]
Bemerkungen
MSDN-Referenz: SET TRANSACTION ISOLATION LEVEL
Lesen Sie unverbindlich
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
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 derREADCOMMITTEDLOCK
Tabellenhinweis verwendet werden, um anstelle der Zeilenversionierung für Transaktionen, die im ModusREAD 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
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
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
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.