4D v14.3

Transaktionen verwenden

Home

 
4D v14.3
Transaktionen verwenden

Transaktionen verwenden  


 

 

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.

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:

 READ WRITE([Invoice Lines])
 READ WRITE([Parts])
 FORM SET INPUT([Invoices];"Input")
 Repeat
    START TRANSACTION
    ADD RECORD([Invoices])
    If(OK=1)
       VALIDATE TRANSACTION
    Else
       CANCEL TRANSACTION
    End if
 Until(OK=0)
 READ ONLY(*)

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:

 READ WRITE([Invoice Lines])
 READ ONLY([Parts])
 FORM SET INPUT([Invoices];"Input")
 Repeat
    ADD RECORD([Invoices])
 Until(bOK=0)
 READ ONLY([Invoice Lines])

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:

 Case of
    :(Form event=On Load)
       START TRANSACTION
       [Invoices]Invoice ID:=Sequence number([Invoices]Invoice ID)
    Else
       [Invoices]Total Invoice:=Sum([Invoice Lines]Total line)
 End case

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:

 Case of
    :(Form event=On Clicked)
       CANCEL TRANSACTION
       CANCEL
 End case

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:

 Case of
    :(Form event=On Clicked)
       $NbLines:=Records in selection([Invoice Lines])
       READ WRITE([Parts]` Wechsle in den Lese/Schreibzugriff für die Tabelle [Parts]
       FIRST RECORD([Invoice Lines]) ` Starte mit der ersten Zeile
       $ValidTrans:=True ` Nimm an, alles ist OK
       For($Line;1;$NbLines` Für jede Zeile
          RELATE ONE([Invoice Lines]Part No)
          OK:=1 ` Nimm an, fortzufahren
          While(Locked([Parts]) & (OK=1))
  ` Versuche, den Datensatz im Lese/Schreibzugriff zu erhalten
             CONFIRM("Der Artikel "+[Invoice Lines]Part No+" wird benutzt. Warten?")
             If(OK=1)
                DELAY PROCESS(Current process;60)
                LOAD RECORD([Parts])
             End if
          End while
          If(OK=1)
  ` Aktualisiere Anzahl im Lager
             [Parts]In Warehouse:=[Parts]In Warehouse-[Invoice Lines]Quantity
             SAVE RECORD([Parts]` Sichere Datensatz
          Else
             $Line:=$NbLines+1 `Verlasse die Schleife
             $ValidTrans:=False
          End if
          NEXT RECORD([Invoice Lines]) ` Gehe in nächste Zeile
       End for
       READ ONLY([Parts]` Setze Tabelle in Status Nur Lesen
       If($ValidTrans)
          SAVE RECORD([Invoices]) ` Sichere Datensatz in Rechnungen
          VALIDATE TRANSACTION ` Bestätige alle Änderungen in der Datenbank
       Else
          CANCEL TRANSACTION ` Brich Transaktion ab
       End if
       CANCEL ` Verlasse Formular
 End case

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.

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Transaktionen

 
SIEHE AUCH 

CANCEL TRANSACTION
In transaction
START TRANSACTION
VALIDATE TRANSACTION

 
ARTIKELVERWENDUNG

4D Programmiersprache ( 4D v12.4)
4D Programmiersprache ( 4D v14 R3)
4D Programmiersprache ( 4D v14 R2)
4D Programmiersprache ( 4D v13.5)
4D Programmiersprache ( 4D v14.3)
4D Programmiersprache ( 4D v14 R4)

Geerbt von : Transaktionen verwenden ( 4D v11 SQL Release 6)