Die SUBTRANS-Anweisung (subtrans_statement) unterteilt eine Transaktion in Teileinheiten, die Subtransaktionen genannt werden.
<subtrans_statement> ::= SUBTRANS BEGIN | SUBTRANS END | SUBTRANS ROLLBACK
Eine Subtransaktion wird eröffnet, d. h. es wird vom Datenbanksystem der aktuelle Standpunkt innerhalb der Transaktion festgehalten. Anschließend kann eine beliebige Folge von SQL-Anweisungen folgen. Wenn diese Folge kein weiteres SUBTRANS BEGIN enthält, können durch SUBTRANS ROLLBACK alle Datenbankänderungen, die nach dem SUBTRANS BEGIN erfolgten, rückgängig gemacht werden.
Die Folge kann jedoch auch weitere SUBTRANS BEGIN-Anweisungen enthalten, die dann weitere Subtransaktionen eröffnen. Zu einem Zeitpunkt kann es daher mehrere offene, geschachtelte Subtransaktionen geben.
Wird eine Subtransaktion mit SUBTRANS END abgeschlossen, bleiben die durchgeführten Änderungen erhalten. Die Subtransaktion wird geschlossen, d. h. das Datenbanksystem vergisst den bei SUBTRANS BEGIN bestimmten Standpunkt innerhalb der Transaktion. Voraussetzung dafür ist, dass eine offene Subtransaktion existiert. Wenn mehr als eine offene Subtransaktion existiert, wird die zuletzt geöffnete Subtransaktion geschlossen, d. h. sie gilt nicht mehr als offene Subtransaktion.
Wenn eine Subtransaktion mit SUBTRANS ROLLBACK abgeschlossen wird, werden alle innerhalb einer Subtransaktion durchgeführten Datenbankänderungen rückgängig gemacht, und die Subtransaktion wird geschlossen. Auch alle Datenbankänderungen von innerhalb der Subtransaktion liegenden Subtransaktionen werden rückgängig gemacht, unabhängig davon, ob diese mit SUBTRANS END oder SUBTRANS ROLLBACK beendet wurden. Alle innerhalb der Subtransaktion erzeugten Ergebnistabellen werden geschlossen.
Voraussetzung dafür ist, dass eine offene Subtransaktion existiert. Wenn mehr als eine offene Subtransaktion existiert, wird die zuletzt geöffnete Subtransaktion zurückgesetzt. Die betroffene Subtransaktion gilt anschließend nicht mehr als offen.
Die SUBTRANS-Anweisung hat keinen Einfluß auf Sperren, die der Transaktion zugeordnet sind. Insbesondere werden bei SUBTRANS END und SUBTRANS ROLLBACK keine Sperren freigegeben.
Die SUBTRANS-Anweisung eignet sich besonders dafür, die Auswirkungen von Unterprogrammen oder Datenbankprozeduren atomar zu machen, d. h. sie so zu gestalten, dass sie entweder alle ihre Aufgaben erfüllen oder andernfalls keine Wirkung haben. Dazu wird am Beginn ein SUBTRANS BEGIN abgesetzt. Wenn das Unterprogramm seine Aufgabe erfolgreich erfüllen konnte, wird am Ende SUBTRANS END benutzt, während im Fehlerfall durch SUBTRANS ROLLBACK alle vom Unterprogramm durchgeführten Änderungen rückgängig gemacht werden.
Durch die COMMIT-Anweisung und die ROLLBACK-Anweisung werden alle noch offenen Subtransaktionen implizit geschlossen.
Siehe auch: