Das fühlt sich wie eine dumme Frage an, aber ich sehe Folgendes im Oracle-Handbuch zur Transaktionsverwaltung:
Eine Transaktion endet, wenn einer der Folgendes geschieht:
Ein Benutzer gibt ein COMMIT oder ROLLBACK aus Anweisung ohne SAVEPOINT-Klausel.
Ein Benutzer führt eine DDL-Anweisung wie z CREATE, DROP, RENAME oder ALTER. Wenn die Die aktuelle Transaktion enthält eine beliebige DML Aussagen, verpflichtet Oracle zunächst die Transaktion, und dann läuft und commits die DDL-Anweisung als neue, einzige Statement-Transaktion.
Ein Benutzer trennt die Verbindung zu Oracle. Das aktuelle Transaktion ist festgeschrieben.
Ein Benutzerprozess wird abnormal beendet. Die aktuelle Transaktion wird gerollt zurück.
Soll ich den letzten Punkt so interpretieren, dass die Transaktion rückgängig gemacht wird, wenn ich eine Abfrage mit einem Fehler ausstelle?
"Benutzerprozess" bezieht sich in diesem Zusammenhang auf den Prozess, der auf dem Clientcomputer ausgeführt wird, der die Verbindung zu Oracle herstellt. Mit anderen Worten, wenn Sie Anwendung A ( SQL*Plus
, TOAD, etc.) verwenden, um eine Verbindung zu Oracle herzustellen, ist der Benutzerprozess SQL*Plus
, TOAD usw. Wenn dieser Benutzerprozess stirbt, während Sie sich in der Mitte eines Transaktion wird diese Transaktion zurückgesetzt. Dies geschieht, sobald PMON feststellt, dass der Client abgestorben ist, was ein wenig Zeit in Anspruch nehmen kann - es ist nicht immer trivial, dass Oracle den Fehler eines Benutzerprozesses von einem Benutzerprozess unterscheidet, der keine Befehle ausgibt der Moment.
das ist eine interessante Frage!
Wenn Oracle einen Fehler feststellt, wird die aktuelle Anweisung zurückgesetzt, nicht die Transaktion. Eine Anweisung ist eine Anweisung auf oberster Ebene, sie kann eine SQL-Anweisung (INSERT, UPDATE ...) oder ein PL / SQL-Block sein.
Dies bedeutet, dass Oracle, wenn eine Anweisung (z. B. eine pl / sql-Prozedur, die von java aufgerufen wird) einen Fehler zurückgibt, die Transaktion in denselben logischen Zustand versetzt wie vor dem Aufruf. Dies ist immens hilfreich, Sie müssen sich nicht um halb ausgeführte Prozeduren kümmern (**).
Dieser Thread auf AskTom deckt das gleiche Thema :
%Vor%[die Aussage] entweder geschieht TATSÄCHLICH oder es TATSÄCHLICH NICHT und die So funktioniert das ist die Datenbank tut das logische Äquivalent von:
Diese Funktion ist meiner Meinung nach der Grund, warum es viel einfacher ist, Datenbankcode (*) in pl / sql zu schreiben als in jeder anderen Sprache.
(*) Code, der natürlich mit einer Oracle DB interagiert, ich nehme an, dass die nativen prozeduralen Sprachen der anderen DBMS ähnliche Eigenschaften haben.
(**) Dies betrifft nur DML, da DDL in Oracle nicht transaktional ist . Seien Sie auch vorsichtig mit einigen DBMS-Paketen, die das Datenwörterbuch aktualisieren (z. B. DBMS_STATS
), sie führen häufig DDL-ähnliche Änderungen durch und geben Commits aus. Weitere Informationen finden Sie in der Dokumentation .
Update: Dieses Verhalten ist eines der wichtigsten Konzepte in PL / SQL. Ich werde ein kleines Beispiel zur Demonstration der Atomarität der pl / sql-Anweisungen liefern:
%Vor%Oracle hat die Transaktion bis kurz vor dem Aufruf von p1 zurückgerollt. Es gibt keine Halbzeitarbeit. Es ist, als ob die Prozedur p1 nie aufgerufen worden wäre.
Ich stimme Justin zu, seine Einsicht ist richtig. Zusätzliche Informationen hinzufügen: Als Anwendungsentwickler sollten Sie explizit einen Rollback-Befehl aufrufen, wenn Fehler auftreten. Das heißt, Sie sollten auch in Betracht ziehen, Anweisungen in Transaktionsblöcke zu gruppieren. Transaktionsblöcke und Rollbacks werden von verschiedenen Technologien unterschiedlich gehandhabt. Es lohnt sich, einige Nachforschungen anzustellen, um sicherzustellen, dass Sie es gut verstehen.
Tags und Links sql oracle plsql oracle10g transactions