sql >> Databasteknik >  >> RDS >> Sqlserver

Vad händer med en oengagerad transaktion när anslutningen stängs?

Den kan vara öppen medan anslutningspooling gäller. Exempel:kommandot timeout kan lämna lås och TXN eftersom klienten skickar som "avbryt".

2 lösningar:

  • Testa i klienten, bokstavligen:

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

  • Använd SET XACT_ABORT ON för att säkerställa att ett TXN rensas upp:Fråga 1 och fråga 2

Jag använder alltid SET XACT_ABORT ON .

Från denna SQL Team-blogg:

Observera att med anslutningspooling, om du helt enkelt stänger anslutningen utan återställning kommer anslutningen endast att återställas till poolen och transaktionen kommer att förbli öppen tills den senare återanvänds eller tas bort från poolen. Detta kan resultera i att låsningar börjar hållas onödiga och orsaka andra timeouts och rullande block.

Från MSDN, avsnittet "Transaktionssupport" (min fetstil)

När en anslutning stängs släpps den tillbaka till poolen och till lämplig underavdelning baserat på dess transaktionskontext. Därför kan du stänga anslutningen utan att skapa ett fel, även om en distribuerad transaktion fortfarande väntar. Detta gör att du kan begå eller avbryta den distribuerade transaktionen vid ett senare tillfälle.



  1. Hur man får förra veckans data i MySQL

  2. Är java.sql.Timestamp tidszonspecifik?

  3. Hur kan jag avgöra i SQL Server om ett dateTime-intervall överlappar ett annat

  4. Hur man uppnår PCI-kompatibilitet för MySQL &MariaDB med ClusterControl - The Replay