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.