Condividi tramite


Modifica dei livelli di isolamento delle transazioni

La proprietà di isolamento è una delle quattro proprietà ACID (atomicità, consistenza, isolamento e durevolezza) che un'unità di lavoro logica deve includere per essere considerata una transazione. Questa proprietà corrisponde alla capacità di proteggere le transazioni dagli effetti degli aggiornamenti eseguiti da altre transazioni simultanee. Il livello di isolamento può essere personalizzato per ogni transazione.

Il Motore di database di SQL Server supporta i livelli di isolamento delle transazioni definiti in SQL-92. L'impostazione dei livelli di isolamento delle transazioni consente ai programmatori di controbilanciare il maggior rischio di determinati problemi di integrità tramite il maggior supporto dell'accesso simultaneo ai dati. I livelli di isolamento sono i seguenti:

  • READ UNCOMMITTED

  • READ COMMITTED

  • REPEATABLE READ

  • SNAPSHOT

  • SERIALIZABLE

Con due eccezioni, ogni livello di isolamento offre un isolamento maggiore rispetto al precedente tramite l'applicazione di blocchi più restrittivi per periodi di tempo più prolungati. Le eccezioni sono SNAPSHOT e READ COMMITTED quando READ_COMMITTED_SNAPSHOT è impostato su ON. Questi livelli di isolamento non acquisiscono blocchi condivisi sulle righe di dati durante le operazioni di lettura. Solo i blocchi SCH-S vengono mantenuti a livello di tabella.

Per impostare i livelli di isolamento delle transazioni, è possibile utilizzare Transact-SQL o un'API di database.

  • Transact-SQL
    Gli script Transact-SQL utilizzano l'istruzione SET TRANSACTION ISOLATION LEVEL.

  • ADO
    Nelle applicazioni ADO la proprietà IsolationLevel dell'oggetto Connection viene impostata su adXactReadUncommitted, adXactReadCommitted, adXactRepeatableRead o adXactReadSerializable.

  • ADO.NET
    Le applicazioni ADO.NET che utilizzano lo spazio dei nomi gestito System.Data.SqlClient possono chiamare il metodo SqlConnection.BeginTransaction e impostare l'opzione IsolationLevel su Unspecified, Chaos, ReadUncommitted, ReadCommitted, RepeatableRead, Serializable e Snapshot.

  • OLE DB
    Quando si avvia una transazione, le applicazioni che utilizzano OLE DB chiamano ITransactionLocal::StartTransaction con l'opzione isoLevel impostata su ISOLATIONLEVEL_READUNCOMMITTED, ISOLATIONLEVEL_READCOMMITTED, ISOLATIONLEVEL_REPEATABLEREAD, ISOLATIONLEVEL_SNAPSHOT o ISOLATIONLEVEL_SERIALIZABLE.

    Quando si specifica il livello di isolamento delle transazioni in modalità autocommit, le applicazioni OLE DB possono impostare la proprietà DBPROPSET_SESSION DBPROP_SESS_AUTOCOMMITISOLEVELS su DBPROPVAL_TI_CHAOS, DBPROPVAL_TI_READUNCOMMITTED, DBPROPVAL_TI_BROWSE, DBPROPVAL_TI_CURSORSTABILITY, DBPROPVAL_TI_READCOMMITTED, DBPROPVAL_TI_REPEATABLEREAD, DBPROPVAL_TI_SERIALIZABLE, DBPROPVAL_TI_ISOLATED o DBPROPVAL_TI_SNAPSHOT.

  • ODBC
    Le applicazioni ODBC chiamano SQLSetConnectAttr con l'opzione Attribute impostata su SQL_ATTR_TXN_ISOLATION e l'opzione ValuePtr impostata su SQL_TXN_READ_UNCOMMITTED, SQL_TXN_READ_COMMITTED, SQL_TXN_REPEATABLE_READ o SQL_TXN_SERIALIZABLE.

    Per le transazioni snapshot, le applicazioni chiamano SQLSetConnectAttr con l'opzione Attribute impostata su SQL_COPT_SS_TXN_ISOLATION e l'opzione ValuePtr impostata su SQL_TXN_SS_SNAPSHOT. È possibile recuperare una transazione snapshot utilizzando SQL_COPT_SS_TXN_ISOLATION oppure SQL_ATTR_TXN_ISOLATION.