2010-12-01 12 views
1

Ich sehe einige Sperren auf unserem DB-Server durch unsere Anwendung erstellt. Was ich nicht verstehe, ist, wie ein Prozess, der Sleeping ist, eine offene Transaktion hat (dieser Prozess 71 ist derjenige, der das Lock erstellt).Wie kann eine SQL-Verbindung eine ausstehende Transaktion auslassen?

Soweit ich weiß, wenn ein Prozess beendet wird, schließt es alle geöffneten Transaktionen. Ist das richtig?

Vielen Dank im Voraus mates.

alt text

+0

Siehe das letzte Feld, dort wird "Open Tran (sactions)" auf 1 gesetzt. –

Antwort

2

Soweit ich weiß, wenn ein Prozess es beendet schließt alle geöffneten Transaktionen. Ist das richtig?

Nein. Wenn Sie explizit eine Transaktion öffnen, müssen Sie explizit commit oder rollback. Bis zu diesem Zeitpunkt bleibt die Transaktion geöffnet, so dass es durchaus möglich ist, dass eine Verbindung inaktiv ist (keine Verarbeitung einer Aufgabe), aber eine Transaktion ohne Commit ausgeführt wird.

Viele Menschen erwarten, dass ein Fehler automatisch eine Transaktion rückgängig zu machen, aber das ist nicht der Fall, wenn Sie

set xact_abort on 
+0

Was passiert, wenn der Prozess unerwartet hängt oder endet? Die Transaktion bleibt für immer dort? –

+2

Wenn die ** Verbindung ** (dh spid) beendet wird, wird die Transaktion automatisch zurückgesetzt, wenn es einen Fehler gibt, der nicht von ausreichender Schwere ist, um die Verbindung zu beenden, wenn "xact_abort" nicht geöffnet ist Spid wird auf irgendeine Weise getötet. –

+0

Dies geschieht durch eine Client-Anwendung mit einem unerwarteten Absturz, der eine Sperre in der Datenbank erstellt. XACT_ABORT funktioniert nur bei Fehlern, die durch SQL-Operationen verursacht wurden, bin ich richtig? –

0

Was haben wie ich weiß, wenn ein Prozess es beendet schließt die alle geöffnet Transaktionen. Ist das richtig?

Ja. Aber es ist nicht garantiert und du solltest dich nicht darauf verlassen. Sie müssen die Verbindung explizit schließen.

Verwandte Themen