Microsoft SQL Server
Transactie-isolatieniveaus
Zoeken…
Syntaxis
- STEL HET TRANSACTIE-ISOLATIENIVEAU IN {LEES ONGERECHTVAARDIGD | LEZEN TOEGEWIJD | HERHAALBAAR LEZEN | SNAPSHOT | SERIALIZABLE} [; ]
Opmerkingen
MSDN-referentie: SET TRANSACTIE-ISOLATIENIVEAU
Lees vrijblijvend
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Dit is het meest toegestane isolatieniveau, omdat het helemaal geen vergrendelingen veroorzaakt. Het geeft aan dat overzichten alle rijen kunnen lezen, inclusief rijen die in transacties zijn geschreven maar nog niet zijn vastgelegd (dat wil zeggen dat ze nog in transactie zijn). Dit isolatieniveau kan onderhevig zijn aan "vuile lezingen".
Lees Committed
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
Dit isolatieniveau is het op een na meest toelaatbare. Het voorkomt vuile leesresultaten. Het gedrag van READ COMMITTED
afhankelijk van de instelling van READ_COMMITTED_SNAPSHOT
:
Indien ingesteld op UIT (de standaardinstelling) gebruikt de transactie gedeelde vergrendelingen om te voorkomen dat andere transacties rijen wijzigen die door de huidige transactie worden gebruikt, en voorkomt het dat de huidige transactie rijen leest die zijn gewijzigd door andere transacties.
Indien ingesteld op AAN, kan de
READCOMMITTEDLOCK
worden gebruikt om gedeelde vergrendeling aan te vragen in plaats van rijversies voor transacties in de modusREAD COMMITTED
.
Opmerking: READ COMMITTED
is het standaardgedrag van SQL Server.
Wat zijn "vuile reads"?
Vuile reads (of niet-gecommitteerde reads) zijn reads van rijen die worden gewijzigd door een open transactie.
Dit gedrag kan worden gerepliceerd met behulp van 2 afzonderlijke query's: een om een transactie te openen en wat gegevens naar een tabel te schrijven zonder te verbinden, de andere om de gegevens te selecteren die moeten worden geschreven (maar nog niet vastgelegd) met dit isolatieniveau.
Vraag 1 - Bereid een transactie voor, maar voltooi deze niet:
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
Vraag 2 - Lees de rijen inclusief de open transactie:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM dbo.demo;
Geeft terug:
col1 col2 ----------- --------------------------------------- 99 Normal transaction 42 Dirty read
PS: vergeet niet om deze demogegevens op te schonen:
COMMIT TRANSACTION;
DROP TABLE dbo.demo;
GO
Herhaalbaar lezen
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
Dit transactie-isolatieniveau is iets minder toelaatbaar dan READ COMMITTED
, omdat gedeelde vergrendelingen worden geplaatst op alle gegevens die door elk overzicht in de transactie worden gelezen en worden vastgehouden totdat de transactie is voltooid , in tegenstelling tot vrijgave na elk overzicht.
Opmerking: gebruik deze optie alleen wanneer dat nodig is, omdat het waarschijnlijker is dat dit zowel de prestaties van de database als de deadlocks veroorzaakt dan READ COMMITTED
.
Momentopname
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
Geeft aan dat gegevens die worden gelezen door een instructie in een transactie, de transactie-consistente versie van de gegevens zijn die bestond aan het begin van de transactie, dat wil zeggen dat alleen gegevens worden gelezen die zijn vastgelegd voordat de transactie startte.
SNAPSHOT
transacties vragen of veroorzaken geen vergrendelingen in de gegevens die worden gelezen, omdat alleen de versie (of momentopname) wordt gelezen van de gegevens die bestonden op het moment dat de transactie begon.
Een transactie die wordt uitgevoerd in SNAPSHOT
isolatieniveau, leest alleen zijn eigen gegevenswijzigingen terwijl deze actief is. Een transactie kan bijvoorbeeld sommige rijen bijwerken en vervolgens de bijgewerkte rijen lezen, maar die wijziging is alleen zichtbaar voor de huidige transactie totdat deze is vastgelegd.
Opmerking: De ALLOW_SNAPSHOT_ISOLATION
database-optie moet op ON staan voordat het SNAPSHOT
isolatieniveau kan worden gebruikt.
serializable
SET TRANSACTION ISOLATION LEVEL SERIALIZEABLE
Dit isolatieniveau is het meest beperkend. Het vraagt bereik vergrendelt het bereik van sleutelwaarden die worden gelezen door elke instructie in de transactie. Dit betekent ook dat INSERT
overzichten van andere transacties worden geblokkeerd als de in te voegen rijen zich binnen het bereik bevinden dat is vergrendeld door de huidige transactie.
Deze optie heeft hetzelfde effect als het instellen van HOLDLOCK
op alle tabellen in alle SELECT
overzichten in een transactie.
Opmerking: deze transactie-isolatie heeft de laagste gelijktijdigheid en mag alleen worden gebruikt wanneer dat nodig is.