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.