Informazioni sui livelli di isolamento

Scaricare il driver JDBC

Le transazioni specificano un livello di isolamento che definisce il modo in cui una transazione è isolata dalle altre. L'isolamento è la separazione delle modifiche apportate alle risorse o ai dati da transazioni diverse. I livelli di isolamento descrivono quali effetti collaterali della concorrenza sono consentiti, come le letture sporche o le letture fantasma.

I livelli di isolamento delle transazioni controllano gli effetti seguenti:

  • Se i blocchi vengono acquisiti durante la lettura dei dati e quali tipi di blocchi vengono richiesti.

  • Per quanto tempo vengono mantenuti i blocchi di lettura.

  • Se operazioni di lettura fanno riferimento a righe modificate da un'altra transazione:

    • Attendere fino a quando il blocco esclusivo sulla riga non viene rilasciato.

    • Recupera la versione confermata della riga così come esisteva quando è stata avviata l'istruzione o la transazione.

    • Leggere la modifica dei dati non ancora confermata.

Scelta di un livello di isolamento

La scelta di un livello di isolamento delle transazioni non ha effetto sui blocchi acquisiti per proteggere le modifiche dei dati. Una transazione ottiene sempre un blocco esclusivo su tutti i dati che modifica. Mantiene quel blocco fino al termine della transazione, indipendentemente dal livello di isolamento impostato per la transazione. Per le operazioni di lettura, i livelli di isolamento delle transazioni definiscono principalmente il modo in cui l'operazione è protetta dagli effetti di altre transazioni.

Un livello di isolamento inferiore aumenta la possibilità che molti utenti accedano ai dati contemporaneamente. Ma aumenta il numero di anomalie di concorrenza, ad esempio letture sporche o aggiornamenti persi, in cui gli utenti potrebbero imbattersi. Un livello di isolamento più elevato, al contrario, riduce i tipi di effetti di concorrenza che gli utenti potrebbero osservare. Ma richiede più risorse di sistema e aumenta le probabilità che una transazione ne blocchi un'altra. La scelta del livello di isolamento corretto dipende dal giusto equilibrio tra requisiti relativi all'integrità dei dati per l'applicazione e overhead di ogni livello di isolamento.

Il massimo livello di isolamento, Serializable, garantisce che una transazione recuperi esattamente gli stessi dati ogni volta che ripete un'operazione di lettura. Ma usa un livello di blocco che probabilmente influisce sugli altri utenti nei sistemi multiutente. Il livello di isolamento minimo, Read uncommitted, consente di recuperare i dati modificati ma di cui non è stato eseguito il commit da altre transazioni. Nel livello read uncommitted possono verificarsi tutti gli effetti collaterali dovuti alla concorrenza, tuttavia non sono previsti blocchi di lettura né gestione delle versioni, quindi l'overhead è ridotto al minimo.

Osservazioni:

Nella tabella seguente vengono illustrati gli effetti collaterali della concorrenza consentiti dai diversi livelli di isolamento.

Livello di isolamento Lettura sporca Lettura non ripetibile Phantom
Lettura non confermata
Lettura confermata No
Lettura ripetibile No No
Snapshot No No No
Serializzabile No No No

Le transazioni devono essere eseguite con un livello di isolamento almeno pari a repeatable read, per evitare aggiornamenti persi che possono verificarsi quando due transazioni leggono entrambe la stessa riga. La riga viene quindi successivamente aggiornata in base ai valori recuperati in origine. Se le due transazioni aggiornano le righe usando una singola UPDATE istruzione e non basano l'aggiornamento sui valori recuperati in precedenza, gli aggiornamenti persi non possono verificarsi al livello di isolamento predefinito di read committed.

Per impostare il livello di isolamento per una transazione, è possibile usare il metodo setTransactionIsolation della classe SQLServerConnection. Questo metodo accetta un valore int come argomento, basato su una delle costanti di connessione, come illustrato di seguito:

con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

Per usare il nuovo livello di isolamento dello snapshot di SQL Server, è possibile usare una delle costanti SQLServerConnection:

con.setTransactionIsolation(SQLServerConnection.TRANSACTION_SNAPSHOT);

In alternativa, è possibile utilizzare:

con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED + 4094);

Per altre informazioni sui livelli di isolamento di SQL Server, vedere "Livelli di isolamento nel motore di database" nella documentazione online di SQL Server.

Vedi anche

Esecuzione di transazioni con il driver JDBC
SET TRANSACTION ISOLATION LEVEL (Transact-SQL)