Condividi tramite


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. Sono descritti i livelli di isolamento relativi agli effetti collaterali consentiti sulla concorrenza, come letture dirty o fantasma.

I livelli di isolamento delle transazioni controllano gli effetti seguenti:

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

  • La durata dei blocchi di lettura.

  • Se un'operazione di lettura che fa riferimento a righe modificate da un'altra transazione:

    • Si blocca fino al rilascio del blocco esclusivo sulla riga.

    • Recupera la versione di cui è stato eseguito il commit della riga esistente al momento dell'avvio dell'istruzione o della transazione.

    • Legge la modifica dei dati di cui non è stato eseguito il commit.

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 effetti di concorrenza, ad esempio letture dirty o aggiornamenti persi, che gli utenti potrebbero osservare. 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. In tale livello possono verificarsi tutti gli effetti collaterali della concorrenza, ma l'assenza di blocco in lettura e di controllo delle versioni riduce al minimo l'overhead.

Osservazioni:

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

Livello di isolamento Lettura dirty Lettura non ripetibile Fittizio
Read Uncommitted
Read Committed No
Lettura ripetibile No No
Snapshot No No No
Serializable No No No

Le transazioni devono essere eseguite almeno a un livello di isolamento Repeatable Read, per impedire la perdita di aggiornamenti che può verificarsi quando due transazioni recuperano 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 istruzione UPDATE e non basano l'aggiornamento sui valori recuperati in precedenza, non possono verificarsi perdite di aggiornamenti al livello di isolamento predefinito 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
IMPOSTARE IL LIVELLO DI ISOLAMENTO DELLA TRANSAZIONE (Transact-SQL)