Transação nível de isolamento Scopes
-
20-08-2019 - |
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.
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