SQL*Plus, AUTOCOMMIT und EXIT
Geschrieben von Uwe M. Küchler am 30. März 2011
Auch wenn das eigentlich ein Grundlagenthema sein sollte — gerade heute durfte ich selbst mal wieder erfahren, daß es folgenreiche Unterschiede zwischen dem kontrollierten Abbruch eines Skriptes in SQL*Plus und dem Abbruch einer Server-seitigen Session gibt.
Mythos: Ein “quit” oder ein “whenever sqlerror exit” bewirken ein Rollback beim Beenden eines Skriptes.
Tatsache: Ein “exit” in SQL*Plus impliziert ein COMMIT und kein ROLLBACK!
Die Oracle-Doku zu SQL*Plus wurde zum Release 10g um einen kleinen, aber wichtigen Satz erweitert, der klarstellt, daß dieses Verhalten auch unabhängig von der Umgebungseinstellung “AUTOCOMMIT” ist.
Damit unterscheidet sich das Standardverhalten des Clients “SQL*Plus” vom Verhalten des RDBMS: Wird eine Session nämlich unterbrochen (“disconnect”) oder abgeschossen (“kill”), dann führt Oracle ein Rollback durch. Übrigens: Dieses implizite Rollback ist meist der Grund, warum Sessions noch lange als “aktiv” gekennzeichnet sind, obwohl sie schon lange zuvor mit “alter system kill session” abgeschossen wurden.
Rollback bei Abbruch
Anstelle von bisher z.B.
whenever sqlerror exit exitcode_error
kann z.B.
whenever sqlerror exit exitcode_error ROLLBACK
verwendet werden. Dann findet bei einem kontrollierten Abbruch (“Graceful Exit”) auch wieder ein Rollback statt — wenn das denn so gewünscht ist.
Autocommit
Dieses eher selten genutzte Feature (das meiner Ansicht nach auch möglichst nicht genutzt werden sollte) sorgt dafür, daß nach einer gewissen Anzahl INSERT/UPDATE/DELETE (Voreinstellung 1) sofort ein COMMIT ausgeführt wird. Damit kann es bei der Fehlersuche in SQL-Skripten schon mal relevant werden, z.B. wenn bei der zweiten Ausführung eines Skriptes nach vorherigem Abbruch Unique Key Constraints verletzt werden. Ein
show autocommit
Gibt dann darüber Auskunft, ob das Feature an- oder abgeschaltet ist.
Weblinks
- Erklärung von Autocommit in der Oracle-Doku (10.2)
- Der Befehl EXIT in der Oracle-Doku (10.2)
- WHENEVER SQLERROR in der Oracle-Doku (10.2)