Transaktionen

Konnektoren definieren drei Arten von Transaktionen. Welche unterstützt werden, hängt zum einem vom jeweiligen Konnektor ab und zum anderen von der Konfiguration. Für einen Konnektor kann in der Konfiguration der Parameter TransactionLevel drei Werte haben:

TransactionLevelBeschreibung
noneTransaktionen werden nicht unterstützt.
localNur lokale Transaktionen werden unterstützt.
xaVerteilte und lokale Transaktionen werden unterstützt.

Mit diesem Parameter kann die Transaktionsunterstützung eines Konnektors eingeschränkt werden.
Konnektoren, die verteilte Transaktionen unterstützen, können so auf lokale Transaktionen eingestellt werden oder ganz ohne Transaktionen gefahren werden.
Es versteht sich von selbst, das ein Konnektor der an sich keine Transaktionen oder nur lokale Transaktionen unterstützt, nicht durch diese Konfigurationseinstellung dazu gebracht werden kann, höherwertige Transaktionsstufen zu unterstützen. Werden nicht unterstützte Transaktionsstufen gewählt, führt dies normalerweise zu einem Fehler bei der Ausführung.
Welche Transaktionsstufen unter welchen Umständen ein einzelner Konnektor unterstützt ist der entsprechenden Dokumentation zu entnehmen.

Transaktionsmethoden

Das Interface DLEConnectorIfc definiert 5 Methoden, die für die Transaktionssteuerung wichtig sind:

 

MethodeBeschreibung
getLocalTransaction()Liefert eine Instanz des DLELocalTransactionIfc zur Behandlung von lokalen Transaktionen.
getXAResource()Liefert eine Instanz des javax.transaction.xa.XAResource Interfaces zur Behandlung von verteilten Transaktionen.
setCurrentXid(Xid xid)Setzt die aktuelle javax.transaction.xa.Xid Transaktionskennung für verteilte Transaktionen.
getCurrentXid()Holt die aktuelle javax.transaction.xa.Xid Transaktionskennung für verteilte Transaktionen.
isManagedByDLE()Gibt true zurück, falls die DLE Transaktionen für diesen Konnektor verwalten soll, false wenn die DLE Transaktionsanforderungen für diesen Konnektor ignorieren soll.

Im folgenden wird auf diese Methoden näher eingegangen.

Transaktionslose Konnektoren

Unterstützt ein Konnektor keine Transaktionen, oder wurde über den Parameter TransactionLevel die Transaktionsstufe auf none gesetzt, werden Transaktionsanforderungen (begin, commit, rollback) nicht an den Konnektor weitergeleitet. Die Methode getLocalTransaction() sollte in diesem Fall null zurückliefern. Alternativ kann sie eine Instanz der Klasse DLENoLocalTransaction zurückgegeben werden. Es handelt sich dabei um eine Implementierung des DLELocalTransactionIfc Interfaces, die alle Transaktionsanforderungen ignoriert.
Die Methoden getXAResource(), setXid() und getXid() brauchen in diesem Fall keine Logik zu implementieren und können null zurückgeben, da sie bei transaktionslosen Konnektoren nicht durch den Transaktionsmanager der DLE aufgerufen werden.

Eine lokale Transaktion ist eine Transaktion, die intern von einem ResourceManager (zum Beispiel der DLE) verwaltet wird und an der kein externer Transaktionsmanager beteiligt ist.
Um lokale Transaktionen zu unterstützen, muss die Methode getLocalTransaction() des Konnektors eine gültige Implementation des DLELocalTransactionIfc zurückgeben. Dieses Interface definiert drei Methoden begin(), commit() und rollback(). Diese Methoden sind entsprechend zu implementieren. Aufgerufen werden diese Methoden durch die DLE wenn auf der Session die entsprechenden Funktionen aufgerufen werden. Zur Fehlerbehandlung sollten die Methoden eine DLETransactionException werfen. Diese hat einen Konstruktor, dem eine Throwable Instanz übergeben werden kann. Diese kann dazu verwendet werden, den ursprünglichen Fehler mitzuliefern. Es kann jedoch auch null als Parameter angegeben werden.

Isolation Level

Für den JDBC Connector kann der Default Isolation Level der Verbindung über eine Property (IsolationLevel) nach Ansi SQL2 gesetzt werden. Mögliche Werte sind:

  • READ_UNCOMMITTED: Geringste Isolation, höchste Performance, es können „Dirty Reads“, „NON-Repeatable Reads“ und „Phantom Reads“ auftreten.
  • READ_COMMITTED: Es gibt keine „Dirty Reads“ mehr, aber es gibt weiterhin „Non-Repeatable Reads“ und „Phantom Reads“.
  • REPEATABLE_READ: Keine „Dirty Reads“ und keine „NON-Repeatable Reads“, aber weiterhin „Phantom Reads“.
  • SERIALIZABLE: Keine „Dirty Reads“, keine „Non-Repeatable Reads“ und keine „Phantom Reads“, höchste Isolation, geringste Performance.

Verteilte Transaktionen

Verteilte Transaktionen sind Transaktionen, die durch einen externen Transaktionsmanager kontrolliert werden. Dieser verwaltet die einzelnen Transaktionen und sorgt über alle laufenden Transaktionen für eine sichere Transaktionsbearbeitung. Mehrere verteilte Transaktionen werden so zu einer globalen Transaktion zusammengefaßt und durch den Transaktionsmanager kontrolliert.
Verteilte Transaktionen werden in Systemen benötigt, die zum Beispiel mehrere transaktionale Systeme (Datenbanken, Messagesysteme etc.) benutzen und eine transaktionale Konsistenz gewährleisten müssen.
Um dies zu erreichen, wird bei verteilten Transaktionen ein sogenanntes two-phase-commit verwendet, um Transaktionen abzuschließen. Dazu werden alle offenen Transaktionen nicht sofort durch commit abgeschlossen, sondern zuerst durch einen prepare Aufruf davon in Kenntnis gesetzt, das ein commit erfolgen wird. Haben alle Transaktionen bestätigt, daß der prepare erfolgreich war und die Transaktion fehlerfrei durch ein commit abgeschlossen werden kann, wird anschließend an alle die commit Anweisung gegeben.
Die DLE implementiert verteilte Transaktionen über den JTA (JAVA TRANSACTION API) Standard.
Damit ein Konnektor verteilte Transaktionen unterstützt muß er die drei Methoden getXAResource(), setXid() und getXId() implementieren.
Die Methode getXAResource() sollte eine gültige Implementation des javax.transaction.xa.XAResource Interfaces zurückliefern.
Die Methode setXid(Xid xid) wird durch die DLE aufgerufen, um den Konnektor mit einer eindeutigen Transaktionskennung zu versorgen. Diese muß durch die Methode getXid() wieder zurückgegeben werden.
Die übergebene javax.transaction.xa.Xid wird durch die DLE erstellt.

Transaktionsmanagement innerhalb der DLE

Die DLE kann durch ihr Konnektorkonzept Verbindungen zu verschiedenen EIS Systemen gleichzeitig aufbauen und dort Daten bearbeiten. Dies macht die DLE zu einem idealen Werkzeug für die Integration verschiedener Systeme, erhöht aber gleichzeitig die Anforderungen an das Transaktionsmanagement.
Die DLE bietet deshalb einen integrierten Transaktionsmanager, der eine sichere Transaktionsverarbeitung auch in heterogenen Systemumgebungen gewährleistet.
Wird auf einer DLESession eine commit Anweisung ausgeführt, wird der Transaktionsmanager der DLE alle offenen Transaktionen je nach deren Möglichkeiten mit einem commit abschließen. Dabei wird, wenn der verwendete Konnektor es erlaubt, ein two-phase-commit Protokoll angewendet.
Ein rollback kann genau so über eine DLESession ausgeführt werden, der Transaktionsmanager wird dann alle laufenden internen Transaktionen zurückfahren.
Liefert ein Konnektor mit der Methode isManagedByDLE() den Wert false zurück, so werden durch den DLE Transaktionsmanager keine Transaktionskommandos an diesen Konnektor weitergeleitet.
Üblicherweise kann man dies über die Konfiguration mit dem Dienstparameter IsDLEManaged (Mögliche Werte true oder false) auch manuell setzen. Ob ein Konnektor diesen Parameter verarbeitet, hängt jedoch von der Implementation ab.
Will man von Transaktionsereignissen innerhalb der DLE informiert werden, so kann ein DLESessionEventListener mit der DLE registriert werden (siehe Dokumentation der DLE API). Der DLE Transaktionsmanager informiert alle registrierten DLESessionEventListener über seine durchgeführten Aktionen.