Personalizando o nível de isolamento da transação

READ COMMITTED é o nível de isolamento padrão do Microsoft Mecanismo de banco de dados do SQL Server. Se um aplicativo precisar operar em um nível de isolamento diferente, poderá usar os seguintes métodos para definir o nível de isolamento:

  • Executar a instrução SET TRANSACTION ISOLATION LEVEL.

  • Aplicativos ADO.NET que usam o namespace gerenciado System.Data.SqlClient podem especificar uma opção IsolationLevel usando o método SqlConnection.BeginTransaction.

  • Aplicativos que usam ADO podem definir a propriedade Autocommit Isolation Levels.

  • Ao iniciar uma transação, os aplicativos que usam OLE DB podem chamar ITransactionLocal::StartTransaction com isoLevel definido como o nível desejado de isolamento da transação. Ao especificar o nível de isolamento em modo de confirmação automática, os aplicativos que usam OLE DB podem definir a propriedade DBPROPSET_SESSION DBPROP_SESS_AUTOCOMMITISOLEVELS como o nível desejado de isolamento da transação.

  • Aplicativos que usam ODBC podem definir o atributo SQL_COPT_SS_TXN_ISOLATION usando SQLSetConnectAttr.

Para obter mais informações sobre a definição dos níveis de isolamento da transação, consulte Ajustando níveis de isolamento da transação.

Quando o nível de isolamento é especificado, o comportamento de bloqueio de todas as consultas e instruções de DML (linguagem de manipulação de dados) na sessão SQL Server opera nesse nível de isolamento. O nível de isolamento permanece em vigor até o término da sessão ou até que o nível de isolamento seja definido como outro nível.

O exemplo seguinte define o nível de isolamento SERIALIZABLE:

USE AdventureWorks2008R2;
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
GO
BEGIN TRANSACTION;
SELECT BusinessEntityID
    FROM HumanResources.Employee;
GO

O nível de isolamento pode ser substituído por uma consulta individual ou instruções DML, se necessário, especificando uma dica no nível de tabela. A especificação de uma dica no nível de tabela não afeta outras instruções na sessão. Recomendamos que as dicas no nível de tabela sejam usadas para alterar o comportamento padrão apenas quando absolutamente necessário.

O Mecanismo de Banco de Dados talvez tenha que adquirir bloqueios ao ler metadados mesmo quando o nível de isolamento é definido como um nível em que os bloqueios de compartilhamento não são solicitados durante a leitura de dados. Por exemplo, uma transação em execução no nível de isolamento de leitura não confirmada não adquire bloqueios de compartilhamento ao ler dados, mas pode solicitar bloqueios ao ler uma exibição de catálogo do sistema. Isso significa que é possível que uma transação de leitura não confirmada cause o bloqueio ao consultar uma tabela quando uma transação simultânea estiver modificando os metadados dessa tabela.

Para determinar o nível de isolamento da transação definido atualmente, use a instrução DBCC USEROPTIONS, como mostrado no exemplo a seguir. O conjunto de resultados pode ser diferente do conjunto de resultados em seu sistema.

USE AdventureWorks2008R2;
GO
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
GO
DBCC USEROPTIONS;
GO

Aqui está o conjunto de resultados.

Set Option Value

---------------------------- -------------------------------------------

textsize 2147483647

language us_english

dateformat mdy

datefirst 7

... ...

Isolation level repeatable read

(14 row(s) affected)

Execução do DBCC concluída. Se o DBCC imprimiu mensagens de erro, contate o administrador do sistema.