Anslutningspoolen anropar sp_resetconnection innan en anslutning återvinns. Att återställa transaktionsisoleringsnivån finns inte i listan över saker som sp_resetconnection gör. Det skulle förklara varför "serialiserbara" läckor över poolade anslutningar.
Jag antar att du kan starta varje fråga genom att se till att den är på rätt isoleringsnivå:
if not exists (
select *
from sys.dm_exec_sessions
where session_id = @@SPID
and transaction_isolation_level = 2
)
set transaction isolation level read committed
Ett annat alternativ:anslutningar med en annan anslutningssträng delar inte en anslutningspool. Så om du använder en annan anslutningssträng för de "serialiserbara" frågorna kommer de inte att dela en pool med "läs committed"-frågorna. Ett enkelt sätt att ändra anslutningssträngen är att använda en annan inloggning. Du kan också lägga till ett slumpmässigt alternativ som Persist Security Info=False;
.
Slutligen kan du se till att varje "serialiserbar" fråga återställer isoleringsnivån innan den återvänder. Om en "serialiserbar" fråga misslyckas med att slutföra, kan du rensa anslutningspoolen för att tvinga ut den skadade anslutningen ur poolen:
SqlConnection.ClearPool(yourSqlConnection);
Detta är potentiellt dyrt, men misslyckade frågor är sällsynta, så du ska inte behöva anropa ClearPool()
ofta.