Ajustando níveis de isolamento da transação

A propriedade de isolamento é uma das quatro propriedades ACID (atomicidade, consistência, isolamento e durabilidade) que uma unidade lógica de trabalho deve ter para que seja qualificada como uma transação. É a habilidade para proteger transações dos efeitos de atualizações executadas por outras transações simultâneas. O nível de isolamento é realmente personalizável para cada transação.

O Mecanismo de banco de dados do SQL Server dá suporte a níveis de isolamento da transação definidos em SQL-92. A definição de níveis de isolamento da transação permite aos programadores trocar o risco crescente de problemas de integridade por maior acesso simultâneo aos dados. Os níveis de isolamento da transação são:

  • READ UNCOMMITTED

  • READ COMMITTED

  • REPEATABLE READ

  • SNAPSHOT

  • SERIALIZABLE

Com duas exceções, cada nível de isolamento oferece mais isolamento do que o nível anterior mantendo mais bloqueios restritivos para períodos mais longos. As exceções são SNAPSHOT e READ COMMITTED quando READ_COMMITTED_SNAPSHOT é definido como ON. Esses níveis de isolamento não adquirem bloqueios compartilhados em linhas de dados durante operações de leitura. Só são mantidos apenas os bloqueios SCH-S no nível de tabela.

Níveis de isolamento da transação podem ser definidos usando Transact-SQL ou por uma API de banco de dados.

  • Transact-SQL
    Scripts Transact-SQL usam a instrução SET TRANSACTION ISOLATION LEVEL.

  • ADO
    Aplicativos ADO definem a propriedade IsolationLevel do objeto Conexão como adXactReadUncommitted, adXactReadCommitted, adXactRepeatableRead ou adXactReadSerializable.

  • ADO.NET
    Aplicativos ADO.NET que usam o namespace gerenciado System.Data.SqlClient podem chamar o método SqlConnection.BeginTransaction e podem definir a opção IsolationLevel com Unspecified, Caos, READUNCOMMITTED, READCOMMITTED, REPEATABLEREAD, Serializable e Snapshot.

  • OLE DB
    Ao iniciar uma transação, aplicativos que usam chamada OLE DB ITransactionLocal::StartTransaction com isoLevel definidos como ISOLATIONLEVEL_READUNCOMMITTED, ISOLATIONLEVEL_READCOMMITTED, ISOLATIONLEVEL_REPEATABLEREAD, ISOLATIONLEVEL_SNAPSHOT ou ISOLATIONLEVEL_SERIALIZABLE.

    Ao especificar o nível de isolamento da transação em modo de confirmação automática, aplicativos OLE DB podem definir a propriedade DBPROPSET_SESSION como DBPROP_SESS_AUTOCOMMITISOLEVELS DBPROPVAL_TI_CHAOS, DBPROPVAL_TI_READUNCOMMITTED, DBPROPVAL_TI_BROWSE, DBPROPVAL_TI_CURSORSTABILITY, DBPROPVAL_TI_READCOMMITTED, DBPROPVAL_TI_REPEATABLEREAD, DBPROPVAL_TI_SERIALIZABLE, DBPROPVAL_TI_ISOLATED ou DBPROPVAL_TI_SNAPSHOT.

  • ODBC
    Aplicativos ODBC chamam SQLSetConnectAttr com Attribute definido como SQL_ATTR_TXN_ISOLATION e ValuePtr definido como SQL_TXN_READ_UNCOMMITTED, SQL_TXN_READ_COMMITTED, SQL_TXN_REPEATABLE_READ ou SQL_TXN_SERIALIZABLE.

    Para transações de instantâneo, aplicativos chamam SQLSetConnectAttr com atributo definido como SQL_COPT_SS_TXN_ISOLATION e ValuePtr definido como SQL_TXN_SS_SNAPSHOT. Uma transação de instantâneo que usa SQL_COPT_SS_TXN_ISOLATION ou SQL_ATTR_TXN_ISOLATION pode ser recuperada.