Pergunta

Quais são as regras de escopo para níveis de isolamento de transação no SQL Server 2005? Eu sei o que os diferentes níveis de dizer, mas não sabe como aplicá-las adequadamente fora de um script executado manualmente. Não consigo encontrar um guia para o uso prático no código de produção-qualidade.

Obviamente, o escopo começa quando você usa um comando como este:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

Mas onde isso vai parar? Se eu definir o nível de iso em um procedimento armazenado e, em seguida, que proc chama outro, faz o proc aninhada herdá-la? Ainda melhor, se eu aumentar o nível iso dentro do proc aninhada é que vai levar de volta para o proc chamando? Fazer comandos de transação como BEGIN TRAN, ROLLBACK, e COMMIT fazer quaisquer diferenças?

Quando um proc armazenado é chamado por uma aplicação ou um trabalho de agente é que as mudanças de nível de isolamento persistir em alguma maneira? Eu sempre tenho para reverter para o LEIA padrão autorizado no final de cada proc?

Gostaria de testá-lo em situações diferentes, mas eu não sei como ler o que o nível de isolamento atual é definida como.

Foi útil?

Solução

Execute o seguinte e veja por si mesmo:

CREATE PROCEDURE dbo.KeepsIsolation
AS
BEGIN
PRINT 'Inside sproc that does not change isolation level';
DBCC USEROPTIONS;
END
GO

CREATE PROCEDURE dbo.ChangesIsolation
AS
BEGIN
PRINT 'Inside sproc that changes isolation level';
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
DBCC USEROPTIONS;
END
GO
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
DBCC USEROPTIONS;
EXEC dbo.KeepsIsolation;
DBCC USEROPTIONS;
EXEC dbo.ChangesIsolation;
-- demonstrates that isolation level restored to REPEATABLE READ after exiting the procedure
    DBCC USEROPTIONS;

Outras dicas

A partir MSDN

Se você emitir SET TRANSACTION ISOLATION LEVEL em um procedimento armazenado ou gatilho, quando o objeto retorna controlar o nível de isolamento é reposto ao nível em vigor quando o objeto foi invocado . Por exemplo, se você definir REPEATABLE READ em um lote, e do lote, em seguida, chama uma armazenados procedimento que define o nível de isolamento para SERIALIZABLE, o isolamento procedimento de ajuste de nível reverte para REPEATABLE READ quando o armazenadas retorna o controle para o lote.

DBCC USEROPTIONS irá exibir o nível de isolamento atual, juntamente com todas as outras opções SET.

De livros na linha

Apenas um dos isolamento da transação opções de nível pode ser definido de uma vez, e permanece definido para essa conexão até que seja explicitamente alterado. este torna-se o comportamento padrão a menos que um opção de otimização é especificado em o nível de tabela na cláusula FROM de o comunicado.

Nível de isolamento não reverte com a transação.

estadias nível de isolamento atual, mesmo se você pôr em procedimentos e funções.

Por favor, note que existe um problema com o escopo de níveis de transação e SqlServer 2012 ou antes, quando alto desempenho ADO.NET Connection Pooling é usado onde isso pode realmente persistem entre fechamento da conexão:

SQL Server: Isolamento vazamentos de nível em toda conexões em pool

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/916b3d8a-c464-4ad5-8901-6f845a2a3447/sql-server-2014-reseting-isolation -level? fórum = sqldatabaseengine

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top