Hat Oracle für die Transaktion ein Rollback auf einen Fehler?
Fühlt sich an wie eine dumme Frage, aber sehe ich Folgendes in die Oracle concepts guide (auf Transaktions-management:
Eine Transaktion endet, wenn eine der
Folgendes tritt auf:Einen Benutzer sendet eine COMMIT-oder ROLLBACK
Anweisung ohne SAVEPOINT-Klausel.Führt ein Benutzer eine DDL-Anweisung wie
ERSTELLEN, löschen, UMBENENNEN oder ÄNDERN. Wenn die
aktuelle Transaktion enthält DML
Aussagen, Oracle erste begeht
Transaktion, und dann läuft und verpflichtet
die DDL-Anweisung als neue single
Anweisung der Transaktion.Benutzer trennt die Verbindung zu Oracle. Die
aktuelle Transaktion ein commit ausgeführt wird.Einen Benutzer-Prozess beendet wird.
Die aktuelle Transaktion ist gerollt
zurück.
Bin ich zu interpretieren der Letzte Punkt bedeutet, dass, wenn ich eine Abfrage ausgeben, dass ein Fehler Auftritt, wird die Transaktion erhalten Rollback?
- Eigentlich klingt es wie eine sehr interessante Frage an mich. Postgres rollsback auf Fehler, und ich habe oft festgestellt, es nervt (und mich gefragt, ob Oracle haben etwas ähnliches).
- Sagen Sie mir, warum sind Sie Transaktionen verwenden, wenn Sie nicht möchten, dass ein rollback auf Fehler? Dies ist einer der wichtigsten Zwecke von Transaktionen.
- Ich bin nicht unbedingt wollen oder nicht wollen. Ich möchte nur wissen, wie Sie funktionieren.
- dies ist der Oracle - immer Transaktionen.
- Streng genommen sind Sie immer mit Transaktionen in einer relationalen Datenbank, es ist nur, dass viele Schnittstellen autocommit jede Aussage.
- genau das war mein Punkt - es gibt keine option, um keine Transaktionen verwenden. Oliver schien von dem Irrtum, dass Sie können opt-out.
- dba.stackexchange.com/questions/84769/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
"User-Prozess" in diesem Zusammenhang bezieht sich auf den Prozess der Ausführung auf dem client-Rechner das schafft die Verbindung zu Oracle. In anderen Worten, wenn Sie EINE Anwendung (
SQL*Plus
, TOAD, usw.) um eine Verbindung zu Oracle, der user-Prozess istSQL*Plus
, TOAD, usw. Wenn das Benutzer-Prozess stirbt, während man in der Mitte einer Transaktion, die Transaktion wird ein Rollback ausgeführt. Dies wird geschehen, sobald PMON entdeckt, dass der AUFTRAGGEBER gestorben ist, das kann ein wenig Zeit nehmen-es ist nicht immer trivial für Oracle zu unterscheiden, die der Ausfall eines Benutzer-Prozess von einem Benutzer-Prozess, die eben nicht mehr ausgeben von Befehlen im moment.dies ist eine interessante Frage !
Wenn Oracle ein Fehler Auftritt, wird ein rollback für die aktuelle Anweisung, nicht die Transaktion. Eine Erklärung ist die top-level-Anweisung, es kann eine SQL-Anweisung (INSERT, UPDATE...) oder ein PL/SQL block.
Dies bedeutet, dass, wenn eine Anweisung (zum Beispiel eine pl/sql Prozedur aufgerufen von java) gibt einen Fehler zurück, Oracle-stellen wird die Transaktion in der gleichen logischen Zustand wie vor dem Aufruf. Das ist ungemein hilfreich, Sie müssen nicht sorgen zu machen über die Hälfte ausgeführten Verfahren (**).
Dieser thread auf AskTom deckt das gleiche Thema:
Diese Funktion, meiner Meinung nach, ist der Grund, warum es ist viel einfacher zu schreiben Datenbank-code (*) im pl/sql als in jeder anderen Sprache.
( * )- code, der im zusammenspiel mit einer Oracle-DB natürlich, ich nehme an, dass die native prozeduralen Sprachen und der andere DBMS haben ähnliche Funktionen.
(**) Dies bezieht sich nur auf DML-da DDL nicht Transaktions - in Oracle. Werden auch Sie vorsichtig mit einigen DBMS-Pakete, aktualisieren Sie die data-dictionary (wie
DBMS_STATS
), die Sie oft tun, die DDL-ähnliche Veränderungen und Ausgabe verpflichtet. Finden Sie die Dokumentation in Zweifel.Update: dieses Verhalten ist einer der wichtigsten Konzept in PL/SQL, werde ich Ihnen ein kleines Beispiel zu zeigen, den Unteilbarkeit der pl/sql-Anweisungen:
Oracle hat ein Rollback der Transaktion bis zu dem Punkt nur vor dem Aufruf p1. Es gibt keine halbe Arbeit getan. Es ist, als wenn die Prozedur p1 hatte nie genannt worden.
Ich Stimme mit Justin, seiner Einsicht richtig ist. Hinzufügen von zusätzlichen Informationen: Wie der Entwickler der Anwendung, sollten Sie explizit aufrufen, wird ein rollback-Befehl, wenn Fehler passieren. Das bedeutet, Sie sollten auch die Gruppierung von Anweisungen in Transaktions-blocks als angemessen. Transaktions-blocks und rollbacks werden anders behandelt, indem verschiedene Technologien, lohnt es sich, einige der Forschung, um sicherzustellen, dass Sie es gut verstehen.