Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server :fuites au niveau de l'isolement sur les connexions regroupées

Le pool de connexions appelle sp_resetconnection avant de recycler une connexion. La réinitialisation du niveau d'isolation des transactions ne figure pas dans la liste des opérations effectuées par sp_resetconnection. Cela expliquerait pourquoi les fuites "sérialisables" sur les connexions groupées.

Je suppose que vous pourriez commencer chaque requête en vous assurant qu'elle est au bon niveau d'isolement :

if not exists (
              select  * 
              from    sys.dm_exec_sessions 
              where   session_id = @@SPID 
                      and transaction_isolation_level = 2
              )
    set transaction isolation level read committed

Autre option :les connexions avec une chaîne de connexion différente ne partagent pas un pool de connexions. Ainsi, si vous utilisez une autre chaîne de connexion pour les requêtes "sérialisables", elles ne partageront pas de pool avec les requêtes "lecture validée". Un moyen simple de modifier la chaîne de connexion consiste à utiliser un identifiant différent. Vous pouvez également ajouter une option aléatoire telle que Persist Security Info=False; .

Enfin, vous pouvez vous assurer que chaque requête "sérialisable" réinitialise le niveau d'isolement avant son retour. Si une requête « sérialisable » ne se termine pas, vous pouvez effacer le pool de connexions pour forcer la connexion contaminée à sortir du pool :

SqlConnection.ClearPool(yourSqlConnection);

C'est potentiellement coûteux, mais les requêtes qui échouent sont rares, vous ne devriez donc pas avoir à appeler ClearPool() souvent.