4D v16.3

Transaktionen verwenden

Home

 
4D v16.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. Befehle zum Steuern von Transaktionen verändern weder die aktuelle Auswahl noch den aktuellen Datensatz.

4D unterstützt 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.

Hinweis: Zur Wahrung der Kompatibilität werden verschachtelte Transaktionen in Anwendungen, die aus Versionen älter als v11 konvertiert wurden, standardmäßig deaktiviert. Weitere Informationen dazu finden Sie im Abschnitt Seite Kompatibilität.

4D bietet ein Feature, um Transaktionen in Ihrem 4D Code anzuhalten und zu reaktivieren. Ist eine Transaktion angehalten, können Sie Operationen unabhängig von der Transaktion selbst ausführen und dann die Transaktion reaktivieren, um sie wie gewohnt zu bestätigen oder abzubrechen. Ist eine Transaktion angehalten, können Sie folgendes ausführen:

  • Datensätze außerhalb der Transaktion anlegen oder ändern, z.B. um den Zähler der Rechnungsnummer zu erhöhen
  • Andere Transaktionen starten, anhalten bzw. schließen

Weitere Informationen dazu finden Sie im Abschnitt Transaktionen anhalten.

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.



Siehe auch 

CANCEL TRANSACTION
In transaction
START TRANSACTION
VALIDATE TRANSACTION

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Transaktionen

 
GESCHICHTE 

Geändert: 4D v15 R4

 
ARTIKELVERWENDUNG

4D Programmiersprache ( 4D v16)
4D Programmiersprache ( 4D v16.1)
4D Programmiersprache ( 4D v16.2)
4D Programmiersprache ( 4D v16.3)