SOG-Helpcenter Logo SOG Business - Software

Transaktionssteuerung


Innerhalb von SOGActiveSkin braucht normalerweise keine Transaktionssteuerung programmiert zu werden, da SOGActiveSkin jedes Event als eine in sich geschlossene Transaktion abzuhandeln versucht.

Für lesende Zugriffe steht mit SOGTransaction.GetCurrent() immer eine Transaktion zur Verfügung.

Die folgenden Funktionen zur manuellen Transaktionssteuerung sollten nur im Ausnahmefall verwendet werden:

    SOGDatabase.Current.BeginTransaction();
    SOGTransaction.CommitCurrentTransaction();
    SOGTransaction.RollbackCurrentTransaction();

Nutzen Sie stattdessen besser die Funktionalität der "SOGLocalTransaction".

Verschachtelte Transaktionssteuerung mit SOGLocalTransaction


Wird ein schreibender SQL-Zugriff entweder direkt, oder innerhalb einer umgebenen Transaktion verwendet, kann folgende Syntax verwendet werden:

    using (SOGLocalTransaction trans = new SOGLocalTransaction())
    {
        ... diverse Funktionen ...
            trans.Commit();
    }

SOGLocalTransaction merkt, ob bereits der umliegende Aufruf eine eigene Transaktion definiert und ordnet sich ggf. unter.
Existiert noch keine Transaktion, wird eine Transaktion begonnen und am Ende des using-Blocks Committed, im Fehlerfall zurückgerollt.

SOGLocalTransaction darf nicht in einem Catch-Block verwendet werden.

Arbeiten mit unterschiedlichen Datenbanken


Soll mit unterschiedlichen Datenbanken gearbeitet werden, so kann eine Datenbank durch den Aufruf von

    using (mydbs.PushDatabase())
    {
        ... diverse Funktionen ...
    }

zur aktuellen Datenbank gemacht werden.
Am Ende des using-Blocks wird automatisch auf die zuvor aktuelle Datenbank zurückgeschaltet.
Die Transaktion der "mydbs" Datenbank wird am Ende des using-Blocks automatisch wieder geschlossen, und die verwendete Datenbankverbindung freigegeben.
Soll schreibend auf die Datenbank zugegriffen werden, sollte zusätzlich eine SOGLocalTransaction verwendet werden.

Verwendung eines "alternative Datenbankkontextes"


Wird häufig auf eine alternative Datenbank umgeschaltet, um dort vor allem lesende Zugriffe durchzuführen, sollte ein "alternativer Datenbankkontext" verwendet werden:

    using (SOGCallContext.Current.Resourcen.PushAlternateDatabaseContext(_mydbs))
    {
        ... diverse Funktionen ...
    }

Jede Umschaltung in den alternativen Datenbankkontext einer Datenbank wird innerhalb eines Threads in immer wieder den gleichen Datenbankkontext umschalten.
Eine dort einmal gestartete Transaktion bleibt bestehen und wird wiederverwendet. Die verwendete Datenbankverbindung bleibt für die Wiederverwendung des alternativen Kontextes reserviert.
Soll schreibend auf die Datenbank zugegriffen werden, sollte zusätzlich eine SOGLocalTransaction verwendet werden.

Durch Wiederverwendung der bestehenden Transaktion und Datenbankverbindung ist ein alternativer Datenbankkontext erheblich performanter als ein ständiges "PushDatabase", welches jedes Mal eine neue Transaktion aufbaut.

Wird der Resourcen-Context freigegeben, werden auch alle enthaltenen, alternative Datenbankverbindungen freigegeben.
ActiveSkin gibt darüber hinaus alternative Datenbankverbindungen der Oberfläche nach einigen Sekunden von selbst wieder frei.

Beachten Sie bei dieser Technik, dass für jedes Datenbankobjekt ein eigner, alternativer Kontext geschaffen wird. Es sollte also nicht bei jedem Zugriff ein neues Datenbankobjekt erzeugt werden, da sonst eine große Anzahl von Datenbankverbindungen verwendet wird, was negative Auswirkungen auf den Datenbankserver haben kann.