Condividi tramite


Livelli di isolamento

L'utilizzo del blocco come meccanismo di controllo delle transazioni contribuisce a risolvere i problemi di concorrenza, poiché consente di eseguire tutte le transazioni isolandole completamente l'una dall'altra, sebbene in qualsiasi momento sia possibile eseguire più di una transazione. Il livello di accettazione di dati inconsistenti relativo a una transazione è detto livello di isolamento. Un maggiore livello di isolamento offre maggiore protezione dall'inconsistenza dei dati, ma comporta lo svantaggio di una minore concorrenza.

In SQL Server Compact 3.5, il livello di isolamento richiesto da un'applicazione determina il comportamento del blocco utilizzato da SQL Server Compact 3.5.

SQL Server Compact 3.5 supporta i livelli di isolamento seguenti, in ordine crescente:

  • Read Committed (livello predefinito di SQL Server Compact 3.5)
  • Repeatable Read
  • Serializable (le transazioni sono completamente isolate l'una dall'altra)

A un livello di isolamento più alto corrisponde una maggiore protezione dall'inconsistenza dei dati. Tuttavia, in questo modo si riduce la concorrenza delle transazioni e si pregiudica l'accesso multiutente.

Nota

Con SQL Server Compact 3.5 è possibile evitare che i dati bloccati di una transazione possano essere letti da un'altra (lettura dirty). A questo scopo, si utilizza un meccanismo di controllo delle versioni delle pagine, che consente agli utenti di leggere i dati senza richiedere blocchi S sui dati. Si ottiene in questo modo un'ottima concorrenza per le operazioni di lettura (SELECT).

Livelli di isolamento e problemi di concorrenza

Nella tabella seguente sono illustrati i livelli di isolamento e i problemi di concorrenza che consentono di risolvere.

Nota

Tra i possibili problemi di concorrenza sono incluse la dipendenza da dati di cui non è stato eseguito il commit, l'analisi inconsistente e le letture fantasma. Per ulteriori informazioni sui problemi di concorrenza, vedere Concorrenza.

Livello di isolamento Dipendenza da dati di cui non è stato eseguito il commit (letture dirty) Analisi inconsistente (letture non ripetibili) Letture fantasma

Read Committed

No

Repeatable Read

No

No

Serializable

No

No

No

I livelli di isolamento possono essere impostati a livello di programmazione o utilizzando la sintassi SQL SET TRANSACTION ISOLATION LEVEL. Per ulteriori informazioni, vedere Livello di isolamento della transazione.

Livello di isolamento nell'ambito di una transazione

Il livello di isolamento predefinito per System.Transaction è Read Committed. Tuttavia, per impostazione predefinita, una transazione all'interno di un ambito viene eseguita con il livello di isolamento impostato su Serializable. Pertanto, quando una connessione SQL Server Compact 3.5 è integrata nell'ambito di una transazione, la transazione implicita (una transazione SQL Server Compact 3.5 creata internamente per l'ambito della transazione) viene eseguita per impostazione predefinita con il livello di isolamento Serializable. Alcuni dei costruttori di overload della classe TransactionScope accettano il livello di isolamento come parametro. Questi devono essere utilizzati per specificare un valore diverso per il livello di isolamento della transazione implicita. Se il livello di isolamento specificato non è supportato da SQL Server Compact 3.5, l'integrazione di una connessione SQL Server Compact 3.5 nell'ambito di una transazione genererà un'eccezione.

Inoltre, la proprietà default lock timeout specificata come parte della stringa di connessione, gestisce il tempo di attesa di una transazione. Tuttavia, quando una connessione è integrata in TransactionScope, TimeSpan di TransactionScope ha la priorità. Ad esempio, se ConnectionString contiene 1000 millisecondi come valore di default lock timeout e la connessione è integrata in un TransactionScope con valore pari a millisecondi, la transazione di ambiente durerà solo 100 millisecondi e non 1000. Questo significa che se si desidera avere timeout di transazione più lunghi ed eseguire comandi in TransactionScope, si dovrà specificare il valore di timeout desiderato nella stringa di connessione così come in TimeSpan per TransactionScope.

Nota

Il valore predefinito di default lock timeout è 2000 millisecondi e quello di TransactionScope è di 1 minuto.

Vedere anche

Concetti

Transazioni (SQL Server Compact)
Blocco (SQL Server Compact)
Cursori (SQL Server Compact)

Guida e informazioni

Assistenza (SQL Server Compact 3.5 Service Pack 1)