Angenommen, ich habe eine Frage:
begin tran
-- some other sql code
Und dann vergesse ich, mich zu verpflichten oder zurückzusetzen.
Was würde passieren, wenn ein anderer Client versucht, eine Abfrage auszuführen?
sql-server
transactions
commit
Charbel
quelle
quelle
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.
quelle
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).
quelle
hängt von der Isolationsstufe der eingehenden Transaktion ab.
SQL-Transaktionsisolation erklärt
quelle
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.
quelle
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
quelle
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.quelle
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.
quelle
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
Hsqldb macht einen Rollback
Ergebnis ist
quelle