sql >> Database >  >> RDS >> Sqlserver

Wat gebeurt er met een niet-toegewezen transactie als de verbinding wordt verbroken?

Het kan open blijven terwijl pooling van verbindingen van toepassing is. Voorbeeld:time-out voor opdrachten kan vergrendelingen en TXN verlaten omdat de client verzendt als "afbreken".

2 oplossingen:

  • Test in de client, letterlijk:

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

  • Gebruik SET XACT_ABORT ON om ervoor te zorgen dat een TXN wordt opgeruimd:Vraag 1 en Vraag 2

Ik gebruik altijd SET XACT_ABORT ON .

Van deze SQL Team-blog:

Houd er rekening mee dat bij pooling van verbindingen, simpelweg het sluiten van de verbinding zonder terugdraaien alleen de verbinding naar de pool terugbrengt en dat de transactie open blijft totdat deze later opnieuw wordt gebruikt of uit de pool wordt verwijderd. Dit kan ertoe leiden dat vergrendelingen onnodig worden vastgehouden en andere time-outs en een rollend blok worden veroorzaakt

Van MSDN, sectie "Transactie-ondersteuning" (mijn vetgedrukt)

Wanneer een verbinding wordt gesloten, wordt deze weer vrijgegeven in de pool en in de juiste onderverdeling op basis van de transactiecontext. Daarom kunt u de verbinding sluiten zonder een fout te genereren, ook al is een gedistribueerde transactie nog steeds in behandeling. Dit stelt u in staat om de gedistribueerde transactie op een later tijdstip vast te leggen of af te breken.



  1. Woordenlijst van SQL Server-query's - A Stick Shift voor DBA's

  2. De volgorde van een SQL Select-instructie zonder Order By-clausule

  3. Een tijdelijke tabel maken op basis van een andere tabel in SQL Server

  4. Hoe Microsoft SQL op Linux te installeren