Führt Oracle die Transaktion bei einem Fehler zurück?

8

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?

    
Jason Baker 23.09.2009, 19:32
quelle

3 Antworten

7

"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.

    
Justin Cave 23.09.2009, 19:36
quelle
12

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 :

  

[die Aussage] entweder geschieht TATSÄCHLICH oder es TATSÄCHLICH NICHT und die   So funktioniert das ist die Datenbank tut das logische Äquivalent von:

%Vor%

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.

    
Vincent Malgrat 23.09.2009 20:08
quelle
1

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.

    
Jay 23.09.2009 20:08
quelle