ADF Task Flows: So können Sie Transaktionen mit Savepoints zwischenspeichern

  • Erstellt von Jürgen Menge
  • Development

Gerade im Datenbank-Umfeld ist das Konzept der Transaktionen weit verbreitet. Darunter versteht man eine Reihe fachlich zusammengehöriger Operationen. Dabei können in Oracle Application Development Framework (ADF) unterschiedliche Abläufe (Task Flows) zu einer Transaktion zusammengefasst werden. Mit Savepoints können auch Teile einer Transaktion gespeichert werden. DOAG Online zeigt, wie es funktioniert.

Transaktionen in Oracle ADF

Ein System, das mit Transaktionen umgehen kann, muss immer den Status der Transaktion verwalten. Wird diese in Gänze ausgeführt, so spricht man von einem Commit. Im Fehlerfall muss indessen die Transaktion zurückgesetzt werden (Rollback). Um zu vermeiden, dass die Datenkonsistenz während Änderungen innerhalb einer laufenden Transaktion nicht kompromittiert wird, muss diese von weiteren Transaktionen getrennt werden (Isolation). In diesem Fall können die Änderungen erst nach erfolgreichem Abschluss von anderen Benutzern gesehen werden. Allerdings ist es möglich, den Status innerhalb einer Transaktion zwischenzuspeichern. Dafür kommen Savepoints zum Einsatz.

Transaktionen und Data Controls

In ADF heißt die Schnittstelle zum Business Service ADF Data Controls. Das API ist für die Steuerung der Transaktionen zuständig. Zur Laufzeit erhält die Benutzer-Session eine Instanz des Data Controls, die bei den ADF Business Components (ADFbc) eine Verbindung zur Datenbank sowie Statusinformationen – zum Beispiel zum aktuell ausgewählten Datensatz – hält.

Sollen mit ADF Unternehmensapplikationen entwickelt werden, so hilft die zielgerichtete Verwendung von Task Flows und deren Transaktions-Einstellungen. Folgende vier Optionen stehen da zur Verfügung:  

  • No Controller Transaction
  • Always Begin New Transaction
  • Always Use Existing Transaction
  • Use Existing Transaction If Possible

Durch die Kombination mit der Option Share Data Controls with Calling Task Flow werden die Transaktions-Grenzen aufgespannt. So kann festgelegt werden, ob die vorhandene Instanz eines Data Controls – und damit deren Status – wiederverwendet werden sollen.

Data Control Frame

ADF verwendet dazu als internes Objekt zur Laufzeit den sogenannten Data Control Frame. Dieser legt fest, welche Task-Flow- und Data-Control-Instanzen eine Transaktion bilden. Zu einem bestimmten Zeitpunkt kann immer nur ein Data Control Frame aktiv sein.

Die Wahl der Einstellungen hat allerdings einen Einfluss auf den Ressourcenverbrauch einer Applikation. Werden die Einstellungen so gewählt, dass ein Benutzer mehrere Instanzen eines oder mehrerer Data Controls erhält, steigen Anzahl der Datenbank-Verbindungen und Speicherverbrauch an.

Savepoints

Savepoints speichern den aktuellen Status innerhalb einer Transaktion. Dies ermöglicht, nur Teile einer Transaktion zurückzusetzen. Wenn zum Beispiel ein untergeordneter Task Flow betreten wird oder ein Benutzer seine Arbeit für längere Zeit unterbricht, ist der Einsatz von Savepoints durchaus sinnvoll.

Wenn wir ADF zum Beispiel mit den ADF Business Components einsetzen, müssen wir jedoch zwischen dem Status des Model (ADFbc) und dem Status des View Controller unterscheiden.

Ein Model Savepoint speichert nur die Änderungen der Daten – also der aktuellen Transaktion. Den Model Savepoint setzt entweder der Entwickler explizit oder der ADFc Controller implizit, wenn ein Bounded Task Flow betreten wird, der keine eigene Transaktion startet. Ein sinnvoller Anwendungsfall wäre zum Beispiel das Zurücksetzen der Werte innerhalb eines Eingabe-Formulars durch den Benutzer.

Ein Controller Savepoint speichert zusätzlich zur Transaktion die Änderungen innerhalb der View-Schicht und die Informationen, die in den Memory Scopes gespeichert sind. ADF Controller Savepoints werden als binäre Objekte in der Datenbank gespeichert.

Innerhalb eines Task Flows werden Controller Savepoints durch eine Method Call Activity, das heißt den expliziten Aufruf der Methode createSavePoint() erzeugt.

Für das Zurücksetzen (Restore) gibt es eine spezielle Save Point Restore-Aktivität innerhalb der Task Flow-Palette. Werden Controller Savepoints verwendet, muss sichergestellt sein, dass bei einem Zurücksetzen der aktuelle Task Flow eindeutig weiß, zu welchem Status (View) er navigieren muss.