GlobalObjects
|
Um mehrere Aktionen in der Objektdatenbank geschlossen vornehmen zu können, werden Transaktionen zur Verfügung gestellt. Wenn eine Reihe von Operationen in der Objektdatenbank in einer Transaktion zusammengefasst sind, können diese z.B. in einem Fehlerfall alle durch den Abbruch der Transaktion rückgängig gemacht werden. Dafür werden die Operationen in einer Transaktion bis zur Bestätigung bzw. bis zum Abbruch in einem Transaktionspuffer gehalten und nicht gleich gespeichert.
Für die Instanz, welche die Transaktion gestartet hat, stellt sich der Zustand der Objektdatenbank dar, als ob das bzw. die Objekte schon gespeichert bzw. gelöscht sind. Währenddessen ist im Mehrbenutzerbetrieb für die anderen Instanzen (Clients des GloServer's) das bzw. die Objekte weiterhin aus der Objektdatenbank gültig.
Es werden geschachtelte Transaktionen unterstützt. Geschachtelt bedeutet hier, dass während einer Transaktion eine weitere Transaktion initiiert werden kann. Wenn diese weitere Transaktion abgebrochen wird, wird nur bis zum letzten "Start" einer Transaktion zurückgerollt. Alle vorherigen und weiteren Aktionen werden bei einer "Bestätigung" der Transaktion ausgeführt. Damit können Transaktionen in Einheiten gekapselt und in weiteren Transaktionen transparent genutzt werden.
Beispiele:
Base.beginTransaction() >> Obj_ A->store() >> Base.beginTransaction() >> Obj_B->store() >> Base.abortTransaction() >> Base.commitTransaction()
Ergebnis: Nur Obj_A ist gespeichert.
Base.beginTransaction() >> Obj_ A->store() >> Base.beginTransaction() >> Obj_B->store() >> Base.commitTransaction() >> Base.abortTransaction()
Ergebnis: Kein Objekt ist gespeichert.
Base.beginTransaction() >> Obj_ A->store() >> Base.beginTransaction() >> Obj_B->store() >> Base.commitTransaction() >> Base.commitTransaction()
Ergebnis: Obj_A und Obj_B sind gespeichert.
Der Start einer Transaktion kann über glo::Base::beginTransaction() initiiert werden. Objektdatenbank-Operationen wie glo::BasePersistent::store (...) und glo::BasePersistent::deleteInBase (...) werden nicht in der Objektdatenbank ausgeführt, sondern im Transaktionspuffer vorgehalten.
Eine Transaktion kann über glo::Base::commitTransaction() bestätigt werden. Das bedeutet, dass alle Aktionen in der Objektdatenbank wie glo::BasePersistent::store (...) und glo::BasePersistent::deleteInBase (...) welche seit dem letzten Start der Transaktion initiiert wurden, ausgeführt und dann aus dem Transaktionspuffer entfernt werden.
Eine Transaktion kann über glo::Base::abortTransaction() abgebrochen werden. Das bedeutet, dass alle Aktionen in der Objektdatenbank wie glo::BasePersistent::store (...) und glo::BasePersistent::deleteInBase (...) welche seit dem letzten Start der Transaktion initiiert wurden, aus dem Transaktionspuffer entfernt, also nicht ausgeführt werden.