Qual é o escopo de isolamento em transações aninhadas no SQL Server?
-
03-07-2019 - |
Pergunta
Considere o seguinte SQL:
BEGIN TRAN SET TRANSACTION ISOLATION LEVEL READ COMMITTED INSERT Bands ( Name ) SELECT 'Depeche Mode' UNION SELECT 'Arcade Fire' -- I've indented the inner transaction to make it clearer. BEGIN TRAN SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT * FROM Bands COMMIT -- What is the isolation level right here? UPDATE Bands SET Name = 'Modest Mouse' WHERE Name = 'Oddest House' COMMIT
Em suma, iniciar uma transação e defina seu nível de isolamento para READ COMMITTED
. Nós, em seguida, fazer alguma SQL aleatória e iniciar outro, transação aninhada. Nesta operação que altere o nível de isolamento para READ UNCOMMITTED
. Em seguida, cometer essa transação e retorno para o outro.
Agora, o meu palpite é que depois de cometer o interior, o nível de isolamento retorna ao READ COMMITTED
. É este correto?
Solução
Eu não acho que está correto.
Consulte as observações aqui: Set Transaction
Apenas um dos o nível de isolamento opções podem ser definidas em um momento, e permanece definido para a conexão enquanto que seja explicitamente alterado.
Outras dicas
Você [Bob Probst] estão correctas. Curiosamente, de acordo com o href="http://msdn.microsoft.com/en-us/library/ms173763(SQL.90).aspx" documentação é ligada:
Se você emitir SET nível de transação isolamento em um procedimento armazenado ou gatilho, quando o objeto retorna controlar o nível de isolamento é redefinido para o 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 um procedimento armazenado que define o nível de isolamento para SERIALIZABLE, as reverte definição do nível de isolamento para REPEATABLE READ quando o procedimento armazenado retorna o controle para o lote.
Assim, a linha inferior aqui é que LEVEL SET TRANSACTION ISOLATION tem procedimento afinidade , não transação afinidade (como eu tinha pensado).
Awesome!