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.