Microsoft SQL Server
Livelli di isolamento delle transazioni
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
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
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
tabellaREADCOMMITTEDLOCK
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
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
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
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.