4D v16.3

Transaktionen anhalten

Home

 
4D v16.3
Transaktionen anhalten

Transaktionen anhalten  


 

Eine Transaktion anhalten ist nützlich zum Durchführen von Operationen innerhalb einer Transaktion, für die keine Steuerung durch die Transaktion erforderlich ist.
Hierzu ein Beispiel: Innerhalb einer Transaktion macht ein Kunde eine Bestellung und aktualisiert auch seine Adresse. Dann ändert er seine Meinung und annulliert die Bestellung. Die Transaktion wird abgebrochen, aber die Adressänderung soll nicht rückgängig gemacht werden. Hier ist es hilfreich, die Transaktion anzuhalten. Es gibt drei Befehle zum Anhalten und Reaktivieren von Transaktionen:

  • SUSPEND TRANSACTION hält die aktuelle Transaktion an. Alle aktualisierten und hinzugefügten Datensätze bleiben gesperrt.
  • RESUME TRANSACTION reaktiviert die angehaltene Transaktion.
  • Active transaction gibt Falsch zurück, wenn die Transaktion angehalten oder keine aktuelle Transaktion vorhanden ist. Wahr, wenn sie gestartet oder reaktiviert ist.

Hier ein Anwendungsbeispiel für eine angehaltene Transaktion. In einer Anwendung mit Rechnungen wollen wir während einer Transaktion eine neue Rechnungsnummer erhalten. Diese Nummer wird berechnet und in der Tabelle [Settings] gespeichert. Bei mehreren Benutzern müssen miteinander konkurrierende Zugriffe geschützt werden. Wegen der Transaktion kann jedoch die Tabelle [Settings] durch einen anderen Benutzer gesperrt sein, obwohl diese Daten von der Haupttransaktion unabhängig sind. Für diesen Fall können Sie die Transaktion beim Zugreifen auf die Tabelle anhalten:

  //Standardmethode zum Erstellen einer Rechnung
 START TRANSACTION
 ...
 CREATE RECORD([Invoices])
 [Invoices]InvoiceID:=GetInvoiceNum //Die Methode aufrufen, um eine verfügbare Nummer zu erhalten.
 ...
 SAVE RECORD([Invoices])
 VALIDATE TRANSACTION

Die Methode GetInvoiceNum hält die Transaktion vor der Ausführung an. Beachten Sie, dass dieser Code auch funktioniert, wenn die Methode außerhalb einer Transaktion aufgerufen wird:

  //Projektmethode GetInvoiceNum
  //GetInvoiceNum -> Nächste verfügbare Rechnungsnummer
 C_LONGINT($0)
 SUSPEND TRANSACTION
 ALL RECORDS([Settings])
 If(Locked([Settings])) //Zugriff mehrerer Benutzer
    While(Locked([Settings]))
       MESSAGE("Waiting for locked Settings record")
       DELAY PROCESS(Current process;30)
       LOAD RECORD([Settings])
    End while
 End if
 [Settings]InvoiceNum:=[Settings]InvoiceNum+1
 $0:=[Settings]InvoiceNum
 SAVE RECORD([Settings])
 UNLOAD RECORD([Settings])
 RESUME TRANSACTION

Ist eine Transaktion angehalten, gilt folgendes:

  • In der Transaktion angelegt, geänderte oder gelöschte Datensätze behalten diesen Status bei.
  • Sie können Datensätze außerhalb der Transaktion anlegen, ändern oder löschen.
  • Sie können eine neue Transaktion starten, aber innerhalb dieser Transaktion keine Datensätze oder Datensatzwerte sehen, die in der angehaltenen Transaktion hinzugefügt oder geändert wurden. Diese neue Transaktion ist in der Tat vollkommen unabhängig von der angehaltenen, ähnlich wie eine Transaktion in einem anderen Prozess. Da die angehaltene Transaktion später reaktiviert und abgebrochen werden kann, sind die hinzugefügten, geänderten oder gelöschten Datensätze für die neue Transaktion automatisch ausgeblendet. Sobald Sie die neue Transaktion beenden oder abbrechen, können Sie diese wieder sehen.
  • Alle Datensätze, die innerhalb der angehaltenen Transaktion geändert, gelöscht oder hinzugefügt werden, bleiben für die anderen Prozesse gesperrt. Versuchen Sie, diese außerhalb der Transaktion zu ändern oder zu löschen, wird ein Fehler erzeugt.

Folgende Grafik gibt einen Überblick:

Während Transaktion A bearbeitete Werte (Datensatz ID1 erhält Val11) sind nicht in der neuen Transaktion B verfügbar, die während der "angehaltenen" Zeit angelegt wird. Während der "angehaltenen" Zeit bearbeitete Werte (Datensatz ID2 erhält Val22 und Datensatz ID3 erhält Val33) werden gesichert, selbst nachdem Transaktion A abgebrochen ist. 

Es gibt spezifische Featuren zur Fehlerverwaltung:

  • Der aktuelle Datensatz jeder Tabelle wird temporär gesperrt, wenn er während der Transaktion geändert wird, und beim Reaktivieren der Transaktion automatisch entsperrt. Dieser Mechanismus ist wichtig, um ungewolltes Sichern auf Teile der Transaktion zu verhindern.
  • Führen Sie eine ungültige Sequenz aus, wie start transaction / suspend transaction / start transaction / resume transaction, wird ein Fehler generiert. Auf diese Weise werden Entwickler darauf hingewiesen, dass sie eine eingefügte Transaktion beenden oder abbrechen müssen, ehe sie reaktiviert wird.

Die vorhandene Funktion In transaction gibt Wahr zurück, wenn eine Transaktion gestartet wurde, auch wenn sie angehalten ist. Über die neue Funktion Transaction active können Sie herausfinden, ob die aktuelle Transaktion angehalten ist. Sie gibt in diesem Fall Falsch zurück. 

Dagegen geben beide Befehle Falsch zurück, wenn keine Transaktion gestartet wurde. Sie müssen dann u.U. die vorhandene Funktion Transaction level verwenden, die in diesem Kontext 0 zurückgibt.

Nachfolgende Grafik zeigt die verschiedenen Kontexte für Transaktionen und die jeweils von den Befehlen zurückgegebenen Werte:



Siehe auch 


Active transaction
RESUME TRANSACTION
SUSPEND TRANSACTION

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Transaktionen

 
GESCHICHTE 

Erstellt: 4D v15 R4

 
ARTIKELVERWENDUNG

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