Ricerca…


Sintassi

  • IMPOSTA LIVELLO DI ISOLAMENTO DELLE TRANSAZIONI {LEGGI NON CORRISPONDENTE | LEGGI IMPEGNATI | LEGGI RIPETIBILI | SNAPSHOT | SERIALIZZABILE} [; ]

Osservazioni

Riferimento MSDN: SET LIVELLO ISOLAMENTO TRANSAZIONE

Leggi non ammesso

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Questo è il livello di isolamento più permissivo, in quanto non causa alcun blocco. Specifica che le istruzioni possono leggere tutte le righe, comprese le righe che sono state scritte nelle transazioni ma non ancora confermate (vale a dire, sono ancora in transazione). Questo livello di isolamento può essere soggetto a "letture sporche".

Leggi Impegnato

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

Questo livello di isolamento è il 2 ° più permissivo. Previene le letture sporche. Il comportamento di READ COMMITTED dipende dall'impostazione di READ_COMMITTED_SNAPSHOT :

  • Se impostato su OFF (impostazione predefinita), la transazione utilizza blocchi condivisi per impedire ad altre transazioni di modificare le righe utilizzate dalla transazione corrente, nonché bloccare la transazione corrente dalla lettura di righe modificate da altre transazioni.

  • Se impostato su ON, l' READCOMMITTEDLOCK tabella READCOMMITTEDLOCK può essere utilizzato per richiedere il blocco condiviso anziché il controllo delle versioni delle righe per le transazioni in esecuzione nella modalità READ COMMITTED .

Nota: READ COMMITTED è il comportamento predefinito di SQL Server.

Cosa sono le "letture sporche"?

Le letture sporche (o letture non vincolate) sono letture di righe che vengono modificate da una transazione aperta.

Questo comportamento può essere replicato utilizzando 2 query separate: una per aprire una transazione e scrivere alcuni dati su una tabella senza commit, l'altra per selezionare i dati da scrivere (ma non ancora impegnati) con questo livello di isolamento.

Query 1 - Prepara una transazione ma non la finisci:

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

Query 2 - Leggi le righe inclusa la transazione aperta:

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

Ritorna:

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

PS: non dimenticare di pulire questi dati demo:

COMMIT TRANSACTION;
DROP TABLE dbo.demo;
GO

Leggi ripetibile

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

Questo livello di isolamento della transazione è leggermente meno permissivo di READ COMMITTED , in quanto i blocchi condivisi sono collocati su tutti i dati letti da ciascuna istruzione nella transazione e vengono conservati fino al completamento della transazione , anziché essere rilasciati dopo ogni istruzione.

Nota: utilizzare questa opzione solo quando necessario, poiché è più probabile che causi un peggioramento delle prestazioni del database e deadlock di READ COMMITTED .

istantanea

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL SNAPSHOT

Specifica che i dati letti da qualsiasi istruzione in una transazione saranno la versione coerente dal punto di vista della transazione dei dati esistenti all'inizio della transazione, cioè, leggerà solo i dati che sono stati impegnati prima dell'avvio della transazione.

SNAPSHOT transazioni SNAPSHOT non richiedono o causano alcun blocco sui dati letti, in quanto vengono letti solo la versione (o istantanea) dei dati esistenti al momento dell'inizio della transazione.

Una transazione in esecuzione nel livello di isolamento SNAPSHOT legge solo le proprie modifiche dei dati mentre è in esecuzione. Ad esempio, una transazione potrebbe aggiornare alcune righe e quindi leggere le righe aggiornate, ma tale modifica sarà visibile solo alla transazione corrente fino a quando non viene confermata.


Nota: l'opzione del database ALLOW_SNAPSHOT_ISOLATION deve essere impostata su ON prima che sia possibile utilizzare il livello di isolamento SNAPSHOT .

Serializable

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL SERIALIZEABLE

Questo livello di isolamento è il più restrittivo. Richiede intervallo blocca l'intervallo di valori chiave che vengono letti da ciascuna istruzione nella transazione. Ciò significa anche che le istruzioni INSERT di altre transazioni verranno bloccate se le righe da inserire si trovano nell'intervallo bloccato dalla transazione corrente.

Questa opzione ha lo stesso effetto dell'impostazione di HOLDLOCK su tutte le tabelle in tutte le istruzioni SELECT in una transazione.


Nota: questo isolamento della transazione ha la concorrenza più bassa e dovrebbe essere utilizzato solo quando necessario.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow