Zoeken…


Syntaxis

  • STEL HET TRANSACTIE-ISOLATIENIVEAU IN {LEES ONGERECHTVAARDIGD | LEZEN TOEGEWIJD | HERHAALBAAR LEZEN | SNAPSHOT | SERIALIZABLE} [; ]

Opmerkingen

MSDN-referentie: SET TRANSACTIE-ISOLATIENIVEAU

Lees vrijblijvend

SQL Server 2008 R2
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

SQL Server 2008 R2
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 modus READ 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

SQL Server 2008 R2
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

SQL Server 2008 R2
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

SQL Server 2008 R2
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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow