Antworten:
Solange Sie eine Transaktion nicht festschreiben oder rückgängig machen , wird sie immer noch "ausgeführt" und hält möglicherweise Sperren.
Wenn Ihr Client (Anwendung oder Benutzer) die Verbindung zur Datenbank vor dem Festschreiben schließt, werden alle noch laufenden Transaktionen zurückgesetzt und beendet.
Sie können dies tatsächlich selbst versuchen, um ein Gefühl dafür zu bekommen, wie dies funktioniert.
Öffnen Sie im Management Studio zwei Fenster (Registerkarten), von denen jedes eine eigene Verbindung zu SQL hat.
Jetzt können Sie eine Transaktion in einem Fenster starten, einige Dinge wie Einfügen / Aktualisieren / Löschen ausführen, aber noch nicht festschreiben. Im anderen Fenster können Sie dann sehen, wie die Datenbank von außerhalb der Transaktion aussieht. Abhängig von der Isolationsstufe kann die Tabelle gesperrt sein, bis das erste Fenster festgeschrieben wird, oder Sie können (nicht) sehen, was die andere Transaktion bisher getan hat usw.
Spielen Sie mit den verschiedenen Isolationsstufen und ohne Sperrhinweis, um zu sehen, wie sie sich auf die Ergebnisse auswirken.
Sehen Sie auch, was passiert, wenn Sie einen Fehler in der Transaktion auslösen.
Es ist sehr wichtig zu verstehen, wie all diese Dinge funktionieren, sonst werden Sie oft überrascht sein, was SQL tut.
Habe Spaß! GJ.
Transaktionen sollen vollständig oder gar nicht ausgeführt werden. Die einzige Möglichkeit, eine Transaktion abzuschließen, ist das Festschreiben. Jede andere Möglichkeit führt zu einem Rollback.
Wenn Sie beginnen und dann nicht festschreiben, wird es daher beim Schließen der Verbindung zurückgesetzt (da die Transaktion abgebrochen wurde, ohne als vollständig markiert zu werden).
hängt von der Isolationsstufe der eingehenden Transaktion ab.
Wenn Sie eine Transaktion öffnen, wird nichts von selbst gesperrt. Wenn Sie jedoch einige Abfragen innerhalb dieser Transaktion ausführen, werden abhängig von der Isolationsstufe einige Zeilen, Tabellen oder Seiten gesperrt, sodass andere Abfragen betroffen sind, die versuchen, von anderen Transaktionen aus auf sie zuzugreifen.
Beispiel für eine Transaktion
tran tt beginnen
Ihre SQL-Anweisungen
Wenn ein Fehler aufgetreten ist, wird ein Rollback-Vorgang ausgeführt
Solange Sie keine Festschreibungstransaktion ausgeführt haben, werden die Daten nicht geändert
BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Y
funktioniert zum Beispiel nicht. Siehe stackoverflow.com/questions/1273376/…
Zusätzlich zu den potenziellen Sperrproblemen, die Sie möglicherweise verursachen, werden Sie feststellen, dass Ihre Transaktionsprotokolle zu wachsen beginnen, da sie nicht über den Mindest-LSN für eine aktive Transaktion hinaus abgeschnitten werden können. Wenn Sie die Snapshot-Isolation verwenden, wächst Ihr Versionsspeicher in Tempdb um ähnliche Gründe.
Sie können verwenden dbcc opentran
, um Details der ältesten offenen Transaktion anzuzeigen.
Bei nicht abgeschlossenen Transaktionen bleibt der Server gesperrt, und andere Abfragen werden nicht auf dem Server ausgeführt. Sie müssen die Transaktion entweder zurücksetzen oder festschreiben. Durch das Schließen von SSMS wird auch die Transaktion beendet, sodass andere Abfragen ausgeführt werden können.
Das Verhalten ist nicht definiert, daher müssen Sie explizit ein Commit oder ein Rollback festlegen:
http://docs.oracle.com/cd/B10500_01/java.920/a96654/basic.htm#1003303
"Wenn der Auto-Commit-Modus deaktiviert ist und Sie die Verbindung schließen, ohne Ihre letzten Änderungen explizit festzuschreiben oder zurückzusetzen, wird eine implizite COMMIT-Operation ausgeführt."
Hsqldb macht einen Rollback
con.setAutoCommit(false);
stmt.executeUpdate("insert into USER values ('" + insertedUserId + "','Anton','Alaf')");
con.close();
Ergebnis ist
2011-11-14 14: 20: 22,519 main INFO [SqlAutoCommitExample: 55] [AutoCommit enabled = false] 2011-11-14 14: 20: 22,546 main INFO [SqlAutoCommitExample: 65] [0 # Benutzer in Datenbank gefunden]