sql >> Database teknologi >  >> RDS >> Sqlserver

Hvad sker der med en ikke-forpligtet transaktion, når forbindelsen lukkes?

Den kan forblive åben, mens forbindelsespooling gælder. Eksempel:kommando timeout kan efterlade låse og TXN, fordi klienten sender som "abort".

2 løsninger:

  • Test i klienten, bogstaveligt talt:

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

  • Brug SET XACT_ABORT ON for at sikre, at et TXN bliver ryddet op:Spørgsmål 1 og Spørgsmål 2

Jeg bruger altid SET XACT_ABORT ON .

Fra denne SQL Team-blog:

Bemærk, at med forbindelsespooling vil blot lukning af forbindelsen uden tilbagerulning kun returnere forbindelsen til poolen, og transaktionen vil forblive åben, indtil den senere genbruges eller fjernes fra poolen. Dette kan resultere i, at låse bliver unødvendige og forårsage andre timeouts og rullende blokering

Fra MSDN, afsnittet "Transaktionssupport" (min fed skrift)

Når en forbindelse lukkes, frigives den tilbage i puljen og ind i den relevante underafdeling baseret på dens transaktionskontekst. Derfor kan du lukke forbindelsen uden at generere en fejl, selvom en distribueret transaktion stadig afventer. Dette giver dig mulighed for at begå eller afbryde den distribuerede transaktion på et senere tidspunkt.



  1. MySQL-forbindelse virker ikke:2002 Ingen sådan fil eller mappe

  2. Sådan replikeres MySQL-database til en anden server

  3. Hvad denne forespørgsel gør for at oprette kommasepareret liste SQL Server?

  4. MySQL PÅ DUBLIKAT NØGLEOPDATERING for flere rækker indsæt i enkelt forespørgsel