sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server:Isolationsnivå läcker över poolade anslutningar

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.



  1. Beräkna tidsskillnaden mellan två rader

  2. Hämtar alla objektbehörigheter för specifik roll

  3. EXTRACT() Exempel – MySQL

  4. Hur man skapar ett index i Django utan driftstopp