“Quando uma conexão é fechada e retornada ao pool, o nível de isolamento da última instrução SET TRANSACTION ISOLATION LEVEL é mantido”?

8

O artigo online do MSDN " Isolamento de instantâneo no SQL Server " declara:

  • "Um nível de isolamento tem escopo em toda a conexão e, uma vez definido para uma conexão com a instrução SET TRANSACTION ISOLATION LEVEL, permanece em vigor até que a conexão seja fechada ou outro nível de isolamento seja definido. Quando uma conexão é fechada e retornada ao pool , o nível de isolamento da última instrução SET TRANSACTION ISOLATION LEVEL é mantido . As conexões subsequentes que reutilizam uma conexão em pool usam o nível de isolamento em vigor no momento em que a conexão é pool "

Não é um parágrafo auto-contraditório ("até" vs. "retido")?

Em seguida, se "o nível de isolamento da última instrução SET TRANSACTION ISOLATION LEVEL for mantido " após fechar a conexão e retorná-la a um pool, como deve ser entendido:

  • que o nível de isolamento padrão terá valor arbitrário (conexões diferentes no pool terão níveis de isolamento diferentes e seu valor dependerá da reabertura da conexão)?
  • ou todos os valores padrão em todas as conexões no pool serão alterados para o último? mas novamente completamente desconhecido antes da mão?
Fulproof
fonte

Respostas:

14

Uma conexão do pool terá o nível de isolamento definido pelo último cliente para usar essa conexão. Sim, é realmente assustador.

O longo e o curto é que, se você alterar o nível de isolamento de uma conexão, deverá explicitamente configurá-lo novamente READ COMMITTEDantes de fechar. Melhor é declarar explicitamente o nível de isolamento necessário no início de qualquer lote, para garantir que seu código não seja afetado por alguém sendo desleixado e retorná-lo ao padrão no final.

Esse comportamento, apesar de desconcertante, aparentemente é planejado por um projeto .

Mark Storey-Smith
fonte
Nunca vi aqueles "deve explicitamente" e "Melhor é explicitamente" em MSDN artigos, livros, blogs, documentos, etc.
Fulproof
5

Não é um parágrafo auto-contraditório ("até" vs. "retido")?

Não para mim, mas posso ver que há outras maneiras de lê-lo. Se você deseja que a documentação seja atualizada para torná-la mais clara, o local apropriado para solicitá-la é no Microsoft Connect . As pessoas aqui não mantêm a documentação da Microsoft.

que o nível de isolamento padrão terá valor arbitrário (conexões diferentes no pool terão níveis de isolamento diferentes e seu valor dependerá da reabertura da conexão)?

Se você estiver reutilizando uma conexão em pool, sim, o nível de isolamento "preexistente" é aquele que estava em vigor quando a conexão em pool foi fechada pela última vez. A melhor prática é definir explicitamente o nível de isolamento necessário ao conectar.

ou todos os valores padrão em todas as conexões no pool serão alterados para o último? mas novamente completamente desconhecido antes da mão?

Não.

Paul White 9
fonte