2009-10-08 19 views

Odpowiedz

22

Może pozostać otwarte, gdy ma zastosowanie buforowanie połączeń. Przykład: timeout polecenia może pozostawiać blokady i TXN, ponieważ klient wysyła jako "abort".

2 rozwiązania:

  • testowe w kliencie, dosłownie:

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

  • Stosować SET XACT_ABORT ON aby zapewniły TXn jest czyszczone: Question 1 i Question 2

Zawsze używam SET XACT_ABORT ON.

Od this SQL Team blog:

Należy zauważyć, że z puli połączeń, prostu zamknięcie połączenia bez wycofanie zmian tylko zwrócić połączenie z basenem i transakcji pozostaną otwarte aż później ponownie wykorzystane lub usunięte z basenu. może to doprowadzić do zamków rozpoczęciem odbyła niepotrzebne i powodować inne limity czasu i walcowanie blok

Od MSDN sekcja „Obsługa transakcji” (mój śmiały)

Kiedy połączenie zostanie zamknięte, to Zwolniony z powrotem do puli i do odpowiedniego podziału na podstawie jego kontekst transakcji. Dlatego można zamknąć połączenie bez generując błąd, , mimo że transakcja rozproszona nadal jest w toku .Umożliwia to zatwierdzenie lub anulowanie transakcji rozproszonej w w późniejszym czasie.

+1

Pule połączeń są wykonywane po stronie klienta, więc jeśli klient wewnętrznie przerywa połączenie bez zamykania go, odpowiada za wycofanie lub wykonanie wszystkiego, co jest potrzebne do rozwiązania tej sytuacji. – Fozi

+0

@Fozi: chyba że masz SET XACT_ABORT ON. – gbn

10

Niezatwierdzone zmiany nie są widoczne poza połączeniem, dlatego czas wycofania nie ma znaczenia. Więc tak, transakcja zostanie ostatecznie wycofana.

+9

Ale może zawiesić inne połączenia (oczekiwanie na commit/rollback) W zależności od izolacji więc czas nadal liczy. –

+2

Prawidłowo, ale nacisk kładzie się "ostatecznie", co jest * złym problemem * – gbn

+0

Sądzę, że jest on wycofywany, gdy tylko połączenie TCP (lub jakiekolwiek inne) zostanie zamknięte/zerwane. Aby uzyskać informacje o połączeniach, zobacz odpowiedź gbn. – Fozi

6

Serwer wycofa się bezzwłocznie z każdej niezaakceptowanej transakcji, gdy sesja zostanie zamknięta.
Pula podmiotów ADO jest odpowiedzialna za usunięcie wszelkich niezobowiązanych transakcji przed zwróceniem transakcji do puli. Jeśli wyłączysz połączenie z oczekującymi transakcjami, zostanie ono wycofane.

Transakcje mogą być uruchamiane przez klienta za pomocą ADO API (SqlConnection.BeginTransaction) lub poprzez wykonanie instrukcji BEGIN TRANSACTION. Protokół TDS między klientem a serwerem ma specjalne tokeny informujące klienta, kiedy transakcja została uruchomiona/zatwierdzona w ten sposób, więc ADO wie, że połączenie oczekuje na transakcje, nawet jeśli są one uruchamiane w kodzie T-SQL.

Powiązane problemy