Oracle
 sql >> Datenbank >  >> RDS >> Oracle

BEGIN - END Blockatomare Transaktionen in PL/SQL

Zuerst BEGIN..END sind lediglich syntaktische Elemente und haben nichts mit Transaktionen zu tun.

Zweitens sind in Oracle alle einzelnen DML-Anweisungen atomar (d. h. sie sind entweder vollständig erfolgreich oder setzen alle zwischenzeitlichen Änderungen beim ersten Fehlschlag zurück) (es sei denn, Sie verwenden die Option EXCEPTIONS INTO, auf die ich hier nicht eingehen werde).

Wenn Sie möchten, dass eine Gruppe von Anweisungen als einzelne atomare Transaktion behandelt wird, würden Sie etwa so vorgehen:

BEGIN
  SAVEPOINT start_tran;
  INSERT INTO .... ; -- first DML
  UPDATE .... ; -- second DML
  BEGIN ... END; -- some other work
  UPDATE .... ; -- final DML
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK TO start_tran;
    RAISE;
END;

Auf diese Weise führt jede Ausnahme dazu, dass die Anweisungen in diesem Block rückgängig gemacht werden, aber alle Anweisungen, die vor diesem Block ausgeführt wurden wird nicht zurückgesetzt.

Beachten Sie, dass ich kein COMMIT einfüge - normalerweise ziehe ich es vor, dass der aufrufende Prozess das Commit ausgibt.

Es ist wahr, dass ein BEGIN..END-Block ohne Ausnahmehandler dies automatisch für Sie erledigt:

BEGIN
  INSERT INTO .... ; -- first DML
  UPDATE .... ; -- second DML
  BEGIN ... END; -- some other work
  UPDATE .... ; -- final DML
END;

Wenn eine Ausnahme ausgelöst wird, werden alle Einfügungen und Aktualisierungen rückgängig gemacht; aber sobald Sie einen Ausnahmehandler hinzufügen möchten, wird er nicht zurückgesetzt. Daher bevorzuge ich die explizite Methode mit Sicherungspunkten.