sql >> Database >  >> RDS >> Sqlserver

SQL Server:Isolatieniveau lekken over gepoolde verbindingen

De verbindingspool roept sp_resetconnection aan voordat een verbinding wordt hergebruikt. Het resetten van het transactie-isolatieniveau staat niet in de lijst met dingen die sp_resetconnection doet. Dat zou verklaren waarom "serialiseerbare" lekken over gepoolde verbindingen.

Ik denk dat je elke zoekopdracht kunt starten door ervoor te zorgen dat deze zich op het juiste isolatieniveau bevindt:

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

Een andere optie:verbindingen met een andere verbindingsreeks delen geen verbindingspool. Dus als u een andere verbindingsreeks gebruikt voor de "serializable"-query's, zullen ze geen pool delen met de "read-committe"-query's. Een gemakkelijke manier om de verbindingsreeks te wijzigen, is door een andere login te gebruiken. U kunt ook een willekeurige optie toevoegen, zoals Persist Security Info=False; .

Ten slotte kunt u ervoor zorgen dat elke "serializable"-query het isolatieniveau opnieuw instelt voordat deze terugkeert. Als een "serializable"-query niet wordt voltooid, kunt u de verbindingspool wissen om de besmette verbinding uit de pool te forceren:

SqlConnection.ClearPool(yourSqlConnection);

Dit is potentieel duur, maar mislukte zoekopdrachten zijn zeldzaam, dus u hoeft ClearPool() niet aan te roepen vaak.



  1. Hoe verwijder ik nieuwe regeltekens uit gegevensrijen in mysql?

  2. Bevoegdheden toekennen aan toekomstige tabellen in PostgreSQL?

  3. PostgreSQL-updates met meerdere rijen in Node.js

  4. Android SQLite-probleem - tabel ... heeft geen kolom met de naam