Może pozostać otwarty, gdy obowiązuje pula połączeń. Przykład:limit czasu polecenia może pozostawić blokady i TXN, ponieważ klient wysyła jako „przerwij”.
2 rozwiązania:
-
Przetestuj w kliencie, dosłownie:
IF @@TRANCOUNT <> 0 ROLLBACK TRAN
-
Użyj
SET XACT_ABORT ON
aby upewnić się, że TXN jest oczyszczony:Pytanie 1 i Pytanie 2
Zawsze używam SET XACT_ABORT ON
.
Z tego bloga zespołu SQL:
Zwróć uwagę, że w przypadku puli połączeń, zamknięcie połączenia bez cofnięcia przywrócenia spowoduje jedynie przywrócenie połączenia z pulą, a transakcja pozostanie otwarta do późniejszego ponownego wykorzystania lub usunięcia z puli. Może to spowodować, że blokady zaczną być niepotrzebne i spowodować inne przekroczenie limitu czasu i blokadę przewijania
Z MSDN, sekcja „Obsługa transakcji” (moje pogrubienie)
Gdy połączenie jest zamykane, jest zwalniane z powrotem do puli i do odpowiedniego podziału na podstawie kontekstu transakcji. Dlatego możesz zamknąć połączenie bez generowania błędu, nawet jeśli transakcja dystrybuowana jest nadal w toku. Pozwala to na zatwierdzenie lub przerwanie rozproszonej transakcji w późniejszym czasie.