Beispiel: Transaktions-Rollback
In diesem Beispiel werden verschiedene Möglichkeiten gezeigt, wie Sie bei Ausführung eines Mappings, bei dem eine Datenbank geändert wird, Datenbankausnahmen behandeln können. In der Datenbank in diesem Beispiel sind Benutzerdatensätze (Tabelle users) und Adressen (Tabelle addresses) gespeichert. Jeder Benutzer kann null, eine oder zwei Adressen haben (z.B. eine Wohnadresse und eine Arbeitsadresse). Jede Adresse in der Tabelle "addresses" enthält ein user_id-Feld, das auf das Feld id in der Tabelle users verweist. Die Tabelle users ist daher eine übergeordnete Tabelle der Tabelle addresses. Im Codefragment unten sehen Sie die SQL-Erstellungs-Skripts für beide Tabellen (die Syntax gilt für eine SQLite-Datenbank):
CREATE TABLE |
Quelltabellen
Es sollen nun alle Daten aus den Tabellen users und addresses in neue Tabellen, nämlich new_users und new_addresses kopiert werden. Diese Tabellen sind fast identisch mit den Tabellen users und addresses. Der einzige Unterschied besteht darin, dass in der Tabelle new_addresses für die Spalten is_shipping und is_billing keine Nullwerte zulässig sind, wie Sie im Codefragment unten sehen. Dies ist wichtig, da dies bedeutet, das bei Nullwerten Ausnahmen auftreten.
CREATE TABLE new_users (id INTEGER NOT NULL PRIMARY KEY, first_name TEXT NOT NULL, last_name TEXT NOT NULL, email TEXT UNIQUE NOT NULL);
CREATE TABLE new_addresses (id INTEGER NOT NULL PRIMARY KEY, user_id INTEGER NOT NULL, is_shipping INTEGER NOT NULL, is_billing INTEGER NOT NULL, type TEXT NOT NULL, city TEXT NOT NULL, street TEXT NOT NULL, number INTEGER NOT NULL, FOREIGN KEY (user_id) REFERENCES new_users (id) ) ; |
Zieltabellen
Unten sehen Sie das Mapping, in dem alle Daten aus den alten in neue Tabellen kopiert werden. Sie finden dieses Mapping unter dem folgenden Pfad: <Dokumente>\Altova\MapForce2024\MapForceExamples\DatabaseExceptions.mfd.
![mf_rollback_ex_01](./images/mf_rollback_ex_01.png)
Wie Sie oben sehen, werden Daten in diesem Mapping unverändert aus einer Datenbankquellkomponente in eine Datenbankzielkomponente kopiert. Aus Gründen der Einfachheit werden keine weiteren Transformationen durchgeführt. Sowohl die Quell- als auch die Zielkomponente sind in diesem Beispiel Teil derselben Datenbank. Es unterscheiden sich nur die Quell- und Zieltabelle. Klicken Sie auf die Schaltfläche , um zu sehen, dass laut Konfiguration vor jeder Einfügeaktion alle Datensätze gelöscht werden. Damit stellen Sie sicher, dass die Zieltabellen vor jeder Einfügung immer leer sind.
![mf_rollback_ex_02](./images/mf_rollback_ex_02.png)
Wie bereits erwähnt, werden Ausnahmen auftreten, wenn die Quelltabelle addresses Nullwerte enthält. Sie können folgendermaßen überprüfen, ob die Quelltabelle Nullwerte enthält:
1.Klicken Sie auf das Register DB-Abfrage.
2.Klicken Sie mit der rechten Maustaste auf die Tabelle addresses und wählen Sie den Befehl In neuem SQL-Editor anzeigen | SELECT.
3.Klicken Sie auf Abfrage ausführen .
![mf_rollback_ex_03](./images/mf_rollback_ex_03.png)
Wie Sie oben sehen, enthält die Quelltabelle addresses eine Reihe von NULL -Feldern. Sie haben verschiedene Möglichkeiten, die dadurch verursachten Ausnahmen bei der Ausführung des Mappings zu behandeln, z.B.:
•A) Rückgängigmachen aller Änderungen mit Rollback, wenn eine Ausnahme auftritt, d.h. es sollen keine Datensätze eingefügt werden, wenn die Quelldaten ungültige Datensätze enthalten.
•B) Überspringen der Datensätze, bei denen Ausnahmen auftreten, wobei gültige Datensätze weiterhin eingefügt werden.
•C) Wie Sie im Mapping oben sehen, fügt das Mapping Daten in zwei hierarchisch verknüpfte Tabellen ein, nämlich new_users und new_addresses. Sie können MapForce so konfigurieren, dass, wenn eine Adresse nicht eingefügt werden konnte, auch der übergeordnete Benutzerdatensatz nicht eingefügt werden soll.
Szenario A: Rückgängigmachung aller Änderungen mit Rollback bei Auftreten einer Ausnahme
Aufgabenstellung: Wenn eine Ausnahme auftritt, sollen alle Änderungen an der Datenbank mit Rollback rückgängig gemacht werden. Konfigurieren Sie das Mapping dazu folgendermaßen:
1.Klicken Sie mit der rechten Maustaste auf die Titelleiste der Datenbankzielkomponente und wählen Sie im Kontextmenü den Befehl Eigenschaften. Doppelklicken Sie alternativ dazu auf die Titelleiste. Daraufhin wird das Dialogfeld "Komponenteneinstellungen" für Datenbanken angezeigt.
2.Aktivieren Sie das Kontrollkästchen Transaktionen verwenden und wählen Sie Rollback für oberste Transaktion und beenden.
Wenn das Mapping, wie oben gezeigt, konfiguriert ist, wird die Transaktion auf der obersten Ebene der Datenbankkomponente bei Auftreten einer Ausnahme mit Rollback rückgängig gemacht. So führen Sie das Mapping mit diesen Einstellungen aus:
1.Klicken Sie auf das Fenster Ausgabe.
2.Klicken Sie im Menü Ausgabe auf SQL-Script ausführen. Daraufhin kommt es aufgrund eines Nullwerts in der Quelltabelle addresses zu einer Ausnahme. Daraufhin wird das Dialogfeld "Datenbanktransaktion - Exception" angezeigt.
![mf_rollback_ex_04](./images/mf_rollback_ex_04.png)
3.Belassen Sie die vorausgewählte Standardoption unverändert und klicken Sie auf OK.
Dies führt zu folgendem Ergebnis:
•Alle Änderungen werden mit Rollback rückgängig gemacht.
•Es werden keine Datensätze in die Tabelle new_users eingefügt.
•Es werden keine Datensätze in die Tabelle new_addresses eingefügt.
Szenario B) Rückgängigmachung der aktuellen Transaktion mit Rollback und Fortsetzung der Ausführung
Aufgabenstellung: Alle Datensätze, bei denen eine Ausnahme generiert wird, sollen übersprungen werden, gültige Datensätze sollen weiterhin eingefügt werden. Konfigurieren Sie das Mapping dazu folgendermaßen:
1.Klicken Sie auf die Schaltfläche neben der Tabelle new_users, aktivieren Sie das Kontrollkästchen Transaktionen verwenden und wählen Sie Rollback für aktuelle Transaktion und fortfahren.
2.Klicken Sie auf die Schaltfläche neben der Tabelle new_addresses, aktivieren Sie das Kontrollkästchen Transaktionen verwenden und wählen Sie Rollback für aktuelle Transaktion und fortfahren.
Wenn das Mapping mit diesen Einstellungen ausgeführt wird, wird das Dialogfeld "Datenbanktransaktion - Ausnahme" angezeigt. Aktivieren Sie die Optionen, wie unten gezeigt, um nur die aktuelle Transaktion mit Rollback rückgängig zu machen und das Mapping weiter auszuführen:
![mf_rollback_ex_05](./images/mf_rollback_ex_05.png)
Dies führt zu folgendem Ergebnis:
•Alle fehlerhaften Transaktionen werden mit Rollback rückgängig gemacht.
•5 von 5 Benutzern werden eingefügt (da es bei keinem user-Datensatz zu einer Datenbankausnahme kam)
•2 von 5 Adressen werden eingefügt (da 3 Adressen Nullwerte enthalten haben und es dadurch zu einer Ausnahme kam)
Szenario C) Rückgängigmachung der obersten Transaktion mit Rollback und Fortsetzung der Ausführung
Aufgabenstellung: Wenn eine Adresse nicht eingefügt werden kann, soll auch der übergeordnete Benutzerdatensatz nicht eingefügt werden. Konfigurieren Sie das Mapping dazu folgendermaßen:
1.Doppelklicken sie auf die Titelleiste der Datenbankkomponente und deaktivieren Sie das Kontrollkästchen Transaktionen verwenden.
2.Klicken Sie auf die Schaltfläche neben der Tabelle new_users, aktivieren Sie das Kontrollkästchen Transaktionen verwenden und wählen Sie die Option Rollback für aktuelle Transaktion und fortfahren.
3.Klicken Sie auf die Schaltfläche neben der Tabelle new_addresses, aktivieren Sie das Kontrollkästchen Transaktionen verwenden und wählen Sie die Option Rollback für oberste Transaktion und fortfahren.
Wenn Sie das Mapping mit dieser Konfiguration ausführen, wird das Dialogfeld "Datenbanktransaktion - Exception" angezeigt. Wählen Sie die Optionen wie unten gezeigt aus und wiederholen Sie diesen Vorgang, sooft Sie gefragt werden:
![mf_rollback_ex_06](./images/mf_rollback_ex_06.png)
Sie erhalten das folgende Ergebnis:
•2 Benutzer (Sharda Junker, Tobie Hughey) werden eingefügt.
•1 Adresse wird eingefügt.
Erläuterung: Der Benutzer "Sharda Junker" ist der einzige Benutzer, der keine Adresse hat. Es gab bei diesem Datensatz keine Ausnahmen, daher wird er eingefügt. Der zweite Benutzer, "Tobie Hughey", wurde eingefügt, da er der einzige Benutzer ist, bei dem es auf Adressebene keine Ausnahmen gab. Alle anderen Benutzerdatensätze wurden nicht eingefügt, da sie mindestens eine Adresse hatten, bei der eine Ausnahme aufgetreten ist und bei denen die Transaktionen mit Rollback rückgängig gemacht wurden.
Es gibt zwei Adressen, die keine Nullen aufweisen und die daher keine Ausnahmen auslösen. Es sind dies die Adressen mit id=1 und id=4. Die Einfügetransaktion für die erste Adresse wurde jedoch mit Rollback rückgängig gemacht, da die übergeordnete Benutzertransaktion rückgängig gemacht werden musste, daher wurde nur die Adresse mit id=4 was eingefügt.
Beachten Sie, dass Sie dasselbe Ergebnis auch folgendermaßen erzielen:
4.Klicken Sie auf die Schaltfläche neben der Tabelle new_users, aktivieren Sie das Kontrollkästchen Transaktionen verwenden und wählen Sie die Option Rollback für aktuelle Transaktion und fortfahren.
5.Klicken Sie auf die Schaltfläche neben der Tabelle new_addresses und deaktivieren Sie das Kontrollkästchen Transaktionen verwenden.
Ausführen des Mappings mit MapForce Server
Wenn Sie MapForce Server lizenziert haben, können Sie das Mapping auch über die Befehlszeile auf einem Linux-, macOS- oder Windows-Rechner ausführen:
1.Kompilieren Sie das Mapping mit dem Menübefehl Datei | Zu MapForce Server-Ausführungsdatei kompilieren zu einer MapForce Server-Ausführungsdatei (.mfx), siehe auch Kompilieren von Mappings zu MapForce Server-Ausführungsdateien.
2.Kopieren Sie die .mfx-Datei und die Datenbank ExceptionsDemo.sqlite in ein Verzeichnis auf den Server-Rechner. Nennen wir es das "Arbeitsverzeichnis".
3.Ändern Sie die Befehlszeile in das Arbeitsverzeichnis und führen Sie MapForce mit dem unten stehenden Befehl aus.
mapforceserver run DatabaseExceptions.mfx.mfx |
Anmerkungen:
•mapforceserver ist der betriebssystemspezifische Pfad zur ausführbaren MapForce Server-Datei. Ändern Sie den Pfad zur .mfx-Datei nach Bedarf. Auf einem Linux-Rechner lautet der Pfad z.B.: /opt/Altova/MapForceServer2024/mapforceserver.
Sie können Mappings bei der Server-Ausführung als API-Aufruf oder als FlowForce Server-Auftrag (entweder bei Bedarf oder in regelmäßigen Abständen) ausführen. Nähere Informationen dazu finden Sie unter Automatisierung mit MapForce Server.