Ein Vorgang in mehreren Fachbereichen

Eine modular aufgebaute Anwendung trennt beispielsweise Unternehmensstammdaten und Rechnungswesen. Das Stammdatenmodul verwaltet Gesellschaften und deren Status. Das Rechnungswesen führt die zugehörigen Hauptbücher. Die Trennung erleichtert es, Regeln und Datenverantwortung einem Fachbereich zuzuordnen.

Für einen übergreifenden Geschäftsvorgang kann dennoch ein gemeinsamer Abschluss erforderlich sein. Im folgenden Beispiel soll eine neue Gesellschaft zusammen mit ihrem Hauptbuch angelegt werden. Scheitert die Eröffnung des Hauptbuchs, darf die Gesellschaft nicht bereits als vollständig eingerichtet erscheinen.

Die fachliche Transaktionsgrenze

Eine Datenbanktransaktion fasst Änderungen zu einer Einheit zusammen. Beim erfolgreichen Abschluss werden sie gemeinsam übernommen; bei einem Abbruch werden die Änderungen dieser Transaktion verworfen. Diese Einheit muss nicht an derselben Stelle enden wie ein Softwaremodul.

Liegen die Daten der beteiligten Module in derselben Datenbank, können getrennte Datenzugriffe an einer gemeinsamen Transaktion teilnehmen. Jedes Modul führt seine eigenen Prüfungen aus. Über den endgültigen Abschluss entscheidet jedoch erst der äußere Geschäftsvorgang.

Stammdaten und Hauptbuch stehen in getrennten Bereichen innerhalb einer gemeinsamen Transaktionsgrenze. Der Abschluss umfasst beide Änderungen.Stammdaten und Hauptbuch stehen in getrennten Bereichen innerhalb einer gemeinsamen Transaktionsgrenze. Der Abschluss umfasst beide Änderungen.
Eigene Datenverantwortung und gemeinsamer Abschluss schließen sich nicht aus. Die Grenze umfasst hier einen fachlichen Vorgang in derselben Datenbank.

Das bindet die Module beim Abschluss aneinander: Ein Konflikt im Rechnungswesen verhindert auch die Anlage der Gesellschaft. Darf die Einrichtung dagegen ausdrücklich als unvollständiger Vorgang bestehen bleiben, kann ein mehrstufiger Ablauf mit sichtbarem Bearbeitungsstatus zweckmäßiger sein. Die gemeinsame Transaktion folgt hier der fachlichen Forderung, keinen solchen Zwischenzustand zuzulassen.

Ein Fehler im zweiten Modul

Beim Anlegen der Gesellschaft werden zunächst deren Angaben geprüft und gespeichert. Anschließend versucht das Rechnungswesen, das Hauptbuch zu eröffnen. Stellt es dabei einen Konflikt fest, wird der Gesamtvorgang abgebrochen. Die zunächst gespeicherten Stammdaten werden dadurch nicht als dauerhafter halber Erfolg sichtbar.

Entscheidend ist, dass das erste Modul die gemeinsame Transaktion nicht vorzeitig abschließt. Ein internes Speichern kann Änderungen an die Datenbank übergeben, ohne sie bereits endgültig zu bestätigen. Für andere Datenbankverbindungen werden die neuen Datensätze erst mit dem gemeinsamen Abschluss freigegeben.

Beispiel: Gesellschaft mit Hauptbuch anlegen
Ergebnis des VorgangsDauerhafter Datenbestand
Beide Module erfolgreichGesellschaft und Hauptbuch sind vorhanden.
Fehler bei der HauptbucheröffnungWeder die Gesellschaft noch ihr Hauptbuch werden angelegt.
Vorübergehender DatenbankkonfliktEin neuer Versuch beginnt mit dem gesamten Vorgang.

Den vollständigen Vorgang wiederholen

Gleichzeitige Änderungen können zu einem vorübergehenden Datenbankkonflikt führen. Ein Beispiel ist ein Deadlock: Zwei Vorgänge warten gegenseitig auf Ressourcen, die der jeweils andere noch hält. Die Datenbank löst diese Situation, indem sie einen der Vorgänge abbricht.

Eine Wiederholung darf dann nicht einfach nur den letzten fehlgeschlagenen Speicherschritt erneut aufrufen. Dieser Schritt beruht möglicherweise auf bereits gelesenen Daten und Zuständen des ersten Versuchs. Stattdessen beginnt der äußere Vorgang mit einer neuen Verbindung, neuen Datenzugriffskontexten und einer neuen Transaktion. Alle fachlichen Prüfungen werden auf dieser Grundlage erneut ausgeführt.

Ob wiederholt wird, hängt von der Fehlerart ab. Ein vorübergehender Transaktionskonflikt ist etwas anderes als eine unzulässige Buchung oder ein fehlendes Pflichtfeld. Außerdem muss die Zahl der Versuche begrenzt bleiben, damit ein dauerhafter Konflikt nicht als endlos wartende Anfrage verborgen wird.

Externe Aktionen getrennt behandeln

Eine bereits verschickte Nachricht oder eine Aktion in einem fremden System lässt sich durch das Zurücksetzen der eigenen Datenbank nicht rückgängig machen. Wird während einer später verworfenen Transaktion bereits ein externer Auftrag ausgelöst, können beide Systeme auseinanderlaufen.

Eine Outbox hält deshalb die Absicht zur Übermittlung zusammen mit den fachlichen Änderungen in derselben Transaktion fest. Erst nach deren Abschluss wird der Eintrag abgearbeitet. Scheitert die Übermittlung, bleibt er für einen weiteren Versuch erhalten. Der Empfänger muss dabei mit wiederholten Nachrichten umgehen können, etwa über eine eindeutige Vorgangskennung.

Dieser Ablauf ist unter anderem in der öffentlichen technischen Dokumentation von Bsft Foundation beschrieben. Für die Anwendung wird festgelegt, welche Änderungen gemeinsam abgeschlossen werden und welche anschließenden Aktionen separat überwacht werden müssen.

Weiterführende Informationen