Como o SqlConnection gerencia o IsolationLevel?

esteArtigo do MSDN afirma que:

Um nível de isolamento tem escopo para 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 é agrupada.

oSqlConnection A classe não possui nenhum membro que possa manter o nível de isolamento. Então, como uma conexão sabe em que nível de isolamento executar ???

A razão pela qual estou perguntando isso é devido ao seguinte cenário:

Abri uma transação usando o TransactionScope no modo serializável, digamos "T1".Abriu uma conexão para T1.T1 é finalizado / descartado, a conexão retorna ao conjunto de conexões.Chamado outra consulta na mesma conexão (depois de obtê-lo do pool de conexão) e esta consulta é executada no modo serializável !!!

Problema:

Como a conexão em pool ainda sabe qual nível de isolamento foi associado a ela ???Como reverter para algum outro nível de transação ???

Resolução:
O motivo pelo qual as conexões em pool estão retornando o nível de isolamento serializável deve-se ao seguinte motivo:

Você tem um pool de conexão (digamos CP1)O CP1 pode ter 50 conexões.Você escolhe uma conexão C1 do CP1 e a executa com Serializable. Esta conexão tem seu nível de isolamento definido agora. Faça o que fizer, isso não será redefinido (a menos que essa conexão seja usada para executar um código em um nível de isolamento diferente).Depois de executar a consulta, C1 (Serializable) volta ao CP1.Se as etapas 1 a 4 forem executadas novamente, a conexão usada poderá ser outra conexão que não seja C1, digamos C2 ou C3. Portanto, isso também terá seu nível de isolamento definido como Serializable.Então, lentamente, o Serialzable está definido para várias conexões no CP1.Quando você executa uma consulta na qual nenhuma configuração explícita do nível de isolamento está sendo feita, a conexão selecionada no CP1 decide o nível de isolamento. Por ex. se essa consulta solicitar uma conexão e o CP1 usar C1 (Serializable) para executar essa consulta, ela será executada no modo Serializable, mesmo que você não a tenha definido explicitamente.

Espero que isso tire algumas dúvidas. :)

questionAnswers(4)

yourAnswerToTheQuestion