Anfang des Inhaltsbereichs

Hintergrunddokumentation Schachtelungen und Verkettungen  Dokument im Navigationsbaum lokalisieren

Rolle der Top-Level-Transaktion

Die Top-Level-Transaktion ist die Transaktion der obersten Ebene. Alle während der Top-Level-Transaktion gestarteten Transaktionen sind Untertransaktionen und führen bei ihrem Ende nicht zu COMMIT WORK. Es hängt vom Transaktionsmodus ab, wie die Top-Level-Transaktion erzeugt wird.

Kompatibilitätsmodus

Die Top-Level-Transaktion wird in der Regel implizit bei der Initialisierung der Object Services erzeugt. Alle expliziten Transaktionen des Programms sind Untertransaktionen dieser impliziten Top-Level-Transaktion.

Objektorientierter Transaktionsmodus:

Die Top-Level-Transaktion wird explizit durch Start der ersten Transaktion im Programm erzeugt. Alle weiteren Transaktionen, die vor der Beendigung der Top-Level-Transaktion gestartet werden, sind Untertransaktionen der expliziten Top-Level-Transaktion.

Untertransaktionen

Durch den Start einer Transaktion vor dem Ende einer anderen Transaktion erzeugt man eine Untertransaktion. Untertransaktionen müssen innerhalb der Transaktion, in der sie eingebettet sind, beendet werden. Bei Beendigung einer Untertransaktion wird nie COMMIT WORK ausgeführt. Die Änderungen an persistenten Objekten einer Untertransaktion werden erst bei Abschluß der Top-Level-Transaktion verbucht. Je nach Transaktionsmodus geschieht dies explizit beim COMMIT WORK oder implizit bei END. Der Transaktionsmodus kann zwar mit IF_OS_TRANSACTION~GET_MODES auch bei Untertransaktionen abgefragt werden, gibt aber immer die globale Einstellung der Object Services für das aktuelle Programm wieder.

Hintereinanderausführungen

Top-Level-Transaktionen

Ein Programm kann zu einem Zeitpunkt immer nur eine Top-Level-Transaktion haben. Nach Beendigung einer Top-Level-Transaktion kann aber wieder eine neue Transaktion als Top-Level-Transaktion gestartet werden.

Kompatibilitätsmodus

Im Kompatibilitätsmodus wird bei der Beendigung der Top-Level-Transaktion mit COMMIT WORK implizit eine neue Top-Level-Transaktion erzeugt und gestartet, welche weitere Änderungen an persistenten Objekten verwaltet.

Objektorientierter Modus

Bei Beendigung der Top-Level-Transaktion mit END wird COMMIT WORK ausgeführt und das Transaktionsobjekt im Programm invalidiert und kann nicht nochmals gestartet werden. Die nächste Transaktion die mit IF_OS_TRANSACTION~START gestartet wird, wird die neue Top-Level-Transaktion. Zwischen dem Ende einer und dem Start der nächsten Top-Level-Transaktion ist ein Programm transaktionslos und Anderungen an persistenten Objekten, die vor dem Start einer neuen Transaktion durchgeführt werden, werden ignoriert.

Untertransaktionen

Innerhalb einer Transaktion können nach dem Ende einer Untertransaktion weitere Untertransaktionen gestartet werden. Änderungen an persistenten Objekten zwischen Untertransaktionen gehören zur Transaktion auf der nächsthöheren Ebene.

Verkettungen von Top-Level-Transaktionen

Bei Hintereinanderausführungen, also beim Beenden einer Top-Level-Transaktion und dem nachfolgenden Start einer neuen Top-Level-Transaktion, werden die betroffenen persistenten Objekte invalidiert. Beim Zugriff auf ein solches Objekt in der Folgetransaktion wird es erneut von der Datenbank geladen. Um dieses (zeitaufwendige) Laden zu verhindern, können Top-Level-Transaktionen mit IF_OS_TRANSACTION~END_AND_CHAIN bzw. IF_OS_TRANSACTION~UNDO_AND_CHAIN verkettet werden. Dabei werden die persistenten Objekte nicht invalidiert. Es wird aber sehr wohl ein neues Transaktionsobjekt erzeugt und seine Referenz als Rückgabewert zurückgegeben.

Die Methoden sind anwendbar auf Top-Level-Transaktion im objektorientierten Modus, aber nicht auf die Top-Level-Transaktion im Kompatibilitätsmodus.

Bei Untertransaktionen ist die Ausführung der Methoden nicht notwendig, da die persistenten Objekte nicht invalidiert, sondern bis zur Verbuchung aufgehoben werden.

Beispiel

data TM type ref to IF_OS_TRANSACTION_MANAGER.
data T  type ref to IF_OS_TRANSACTION.

...

TM = CL_OS_SYSTEM=>GET_TRANSACTION_MANAGER( ).

T = TM->CREATE_TRANSACTION( ). "Create first Transaction

T->START( ).                   "Start first Transaction
  ...
T = T->END_AND_CHAIN( ).       
"End first Transaction,
                              "create and start second one

  ...
T->END( ).                    
"End second Transaction

Die Referenzvariable T zeigt nach Aufruf der Methode END_AND_CHAIN auf ein neues Transaktionsobjekt!