Eine Transaktion führt hintereinander Operationen aus, die Sie jederzeit komplett wieder rückgängig machen können. Die logische Datenintegrität wird dabei gewahrt. Eine Transaktion wird erst in der Datenbank gesichert, wenn die Transaktion bestätigt wird. Änderungen werden nicht gesichert, wenn eine Transaktion nicht abgeschlossen ist, weil sie entweder abgebrochen oder durch ein von außen kommendes Ereignis unterbrochen wird.
Während einer Transaktion werden alle Änderungen in der Datenbank innerhalb eines Prozesses lokal in einem temporären Speicher gesichert. Wird die Transaktion mit VALIDATE TRANSACTION bestätigt, werden die Änderungen dauerhaft gesichert. Wird die Transaktion mit CANCEL TRANSACTION abgebrochen, werden die Änderungen nicht gesichert.
4D unterstützt ab Version 11 verschachtelte Transaktionen, d.h. Transaktionen auf verschiedenen hierarchischen Ebenen. Die Anzahl der erlaubten Untertransaktionen ist unbegrenzt. Über die Funktion Transaction level können Sie die aktuelle Transaktionsebene finden, auf welcher der Code ausgeführt wird.
Bei Verwendung verschachtelter Transaktionen hängt das Ergebnis der Untertransaktion davon ab, ob die höher gelegene Transaktion annulliert oder bestätigt wurde. Bei Bestätigung werden die Ergebnisse der Untertransaktionen bestätigt. Bei Annullierung werden alle dazugehörigen Untertransaktionen annulliert, unabhängig von ihrem Ergebnis.
Da verschachtelte Transaktionen die Funktionsweise von Datenbanken älterer Versionen beeinträchtigen können, ist sie in konvertierten Datenbanken standardmäßig inaktiv, d.h. hier sind Transaktionen auf eine Ebene begrenzt. Um in einer konvertierten Datenbank Transaktionen auf mehreren Ebenen durchzuführen, müssen Sie in den Einstellungen der Datenbank auf der Seite "Anwendung>Kompatibilität" die Option Verschachtelte Transaktionen markieren.
Diese Option erscheint nur für konvertierte Datenbanken. Sie ist standardmäßig nicht markiert und gilt spezifisch für jede Datenbank. Sie hat keine Auswirkung auf Transaktionen, die mit der SQL-Engine von 4D ausgeführt werden. SQL-Transaktionen sind immer mehrschichtig.
In diesem Beispiel ist die Datenbank ein einfaches Rechnungssystem. Die Rechnungszeilen werden in einer Tabelle [Invoice Lines] gespeichert, die über die Felder [Invoices]Invoice ID und [Invoice Lines]Invoice ID mit der Tabelle [Invoices] verknüpft ist. Beim Hinzufügen einer Rechnung wird mit der Funktion Sequence number eine einmalige Kennung berechnet. Die Verknüpfung zwischen [Invoices] und [Invoice Lines] ist eine automatische Eine-zu-Viele Verknüpfung. Im Dialogfenster Verknüpfungseigenschaften ist das Ankreuzfeld Automatische Zuweisung des verknüpften Wertes aktiviert.
Die Verknüpfung zwischen [Invoice Lines] und [Parts] ist manuell.
![](../../picture/35829/pict35829.de.png)
Gibt ein Benutzer eine Rechnung ein, werden folgende Schritte ausgeführt:
- In der Tabelle [Invoices] wird ein Datensatz hinzugefügt.
- In der Tabelle [Invoice Lines] werden mehrere Datensätze hinzugefügt.
- Das Datenfeld [Parts]In Warehouse wird für jeden in der Rechnung aufgeführten Artikel aktualisiert.
Dieses Beispiel ist eine typische Situation für eine Transaktion. Sie müssen sicher sein, dass Sie all diese Datensätze während der Operation sichern bzw. die Transaktion abbrechen können, wenn sich ein Datensatz nicht hinzufügen oder aktualisieren lässt. Mit anderen Worten, Sie müssen verknüpfte Daten sichern. Ohne Transaktion ist die logische Datenintegrität Ihrer Datenbank nicht gewährleistet. Ist zum Beispiel ein Datensatz in der Tabelle [Parts] gesperrt, kann die Anzahl im Datenfeld [Parts]In Warehouse nicht aktualisiert werden. Dieses Feld ist also logisch nicht mehr korrekt. Die Summe der verkauften Artikel und der Lagerbestand sind nicht identisch mit der im Datensatz eingegebenen Anzahl. Mit einer Transaktion verhindern Sie solch eine Situation.
Es gibt verschiedene Arten, bei der Dateneingabe mit Transaktionen zu arbeiten:
1. Sie verwalten die Transaktion selbst. Dazu setzen Sie die Befehle START TRANSACTION, VALIDATE TRANSACTION und CANCEL TRANSACTION ein. Wir schreiben beispielsweise:
2. Um das Datensatzsperren während der Dateneingabe zu reduzieren, können Sie auch Transaktionen von der Formularmethode aus steuern und auf die Tabellen nur wenn notwendig, im LESE/SCHREIBMODUS zugreifen.
Sie führen die Dateneingabe im Eingabeformular für [Invoices] aus, die die verknüpfte Tabelle [Invoice Lines] in einem Unterformular einhält. Das Formular hat zwei Schaltflächen: bCancel und bOK, beide führen keine Aktion aus. Die Schleife zum Hinzufügen lautet:
Beachten Sie, dass die Tabelle [Parts] nun während der Dateneingabe im Modus Nur Lesen ist. Der Zugriff im Lese-/ Schreibmodus ist nur verfügbar, wenn die Dateneingabe bestätigt wird.
Die Transaktion wird in folgender [Invoices] Eingabeformularmethode gestartet:
Klicken Sie auf die Schaltfläche bCancel, muss sowohl die Dateneingabe als auch die Transaktion annulliert werden.
Die Objektmethode für die Schaltfläche bCancel lautet:
Klicken Sie auf die Schaltfläche bValidate, muss die Dateneingabe angenommen und die Transaktion bestätigt werden. Die Objektmethode für die Schaltfläche bOK lautet:
In diesem Code rufen wir den Befehl CANCEL unabhängig von der Schaltfläche auf. Der neue Datensatz wird nicht durch Aufrufen von ACCEPT bestätigt, sondern durch den Befehl SAVE RECORD. Beachten Sie, dass zusätzlich SAVE RECORD unmittelbar vor dem Befehl VALIDATE TRANSACTION aufgerufen wird. So ist das Sichern des [Invoices] Datensatzes aktueller Teil der Transaktion. Das Aufrufen des Befehls ACCEPT bestätigt auch den Datensatz, in diesem Fall würde die Transaktion ebenfalls den Datensatz bestätigen, die Transaktion würde jedoch vor Sichern des [Invoices] Datensatzes bestätigt. Demnach würde der Datensatz außerhalb der Transaktion bestätigt.
Bei der Dateneingabe können Sie die Transaktionen entweder von 4D verwalten lassen oder - wie in den obigen Beispielen gezeigt - in Ihrer Datenbank individuell einstellen. Das Steuern von gesperrten Datensätzen im letzten Beispiel kann noch weiter entwickelt werden.