Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

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


O pool de conexões chama sp_resetconnection antes de reciclar uma conexão. Redefinir o nível de isolamento da transação não está na lista de coisas que sp_resetconnection faz. Isso explicaria por que vazamentos "serializáveis" em conexões agrupadas.

Acho que você pode iniciar cada consulta certificando-se de que esteja no nível de isolamento correto:
if not exists (
              select  * 
              from    sys.dm_exec_sessions 
              where   session_id = @@SPID 
                      and transaction_isolation_level = 2
              )
    set transaction isolation level read committed

Outra opção:conexões com uma string de conexão diferente não compartilham um pool de conexões. Portanto, se você usar outra cadeia de conexão para as consultas "serializáveis", elas não compartilharão um pool com as consultas de "leitura confirmada". Uma maneira fácil de alterar a string de conexão é usar um login diferente. Você também pode adicionar uma opção aleatória como Persist Security Info=False; .

Por fim, você pode garantir que cada consulta "serializável" redefina o nível de isolamento antes de retornar. Se uma consulta "serializável" não for concluída, você poderá limpar o pool de conexões para forçar a conexão contaminada a sair do pool:
SqlConnection.ClearPool(yourSqlConnection);

Isso é potencialmente caro, mas as consultas com falha são raras, portanto, você não deve chamar ClearPool() frequentemente.