Lade...
 

RetryTXN

RetryTXN

224453

RetryTXN, RetryTXN(DEADLOCK(n), LOCK_TIMEOUT(n))

Der Befehl RetryTXN definiert einen Codeblock der in eine eigene Transaktion eingeschlossen ist und automatisch bis zu n-Mal erneut ausgeführt wird, falls die der Transaktionscommit aufgrund eines Deadlocks oder Lock-Timeouts abbricht. Die maximale Anzahl der Wiederholungen wird pro Fehlertyp definiert und falls die Anzahl nicht explizit angegeben wurde, werden die Default-Werte aus  MaxDeadlockRetries und MaxLockTimeoutRetries verwendet.

RetryTXN kann verwendet werden, um die Anwendung resilienter gegen Deadlocks und Lock-Timeouts zu gestalten und diese automatisch zu behandeln, anstatt sie dem Nutzer zu melden. Wie hier beschrieben, ist die Verwendung von RetryTXN höchstens ein Workaround und für eine nachhaltige Lösung sollte das zugrundeliegende Problem stattdessen behoben werden.

Um sicherzustellen, dass der RetryTXN-Codeblock immer als ganzes in einer Transaktion ausgeführt wird und der Zustand im Falle eines Abbruchs an den Anfang von RetryTXN zurückgesetzt werden kann, beendet RetryTXN die aktuell laufende Transaktion und startet eine neue Schreibtransaktion. Sobald der Block wieder verlassen wird, wird diese Transaktion wieder beendet.

Falls ein Lock-Timeout oder Deadlock die aktuelle Transaktion abbricht, dann wird analog zu AbortTXN der Systemzustand wie hier beschrieben an den Anfang der Transaktion zurückgesetzt. Da der RetryTXN-Codeblock erneut ausgeführt werden können muss, wird vor dem erneuten Ausführen des Codeblocks zusätzlich der Stack auf den Zustand zurückgesetzt, wie er beim Betreten des RetryTXN-Codeblocks war.

Achtung: Lokale Variablen und Änderungen im transienten Raum werden weiterhin NICHT zurückgesetzt, dies sollte beim Schreiben von RetryTXN-Blöcken unbedingt beachtet werden!

Da RetryTXN den Zustand immer auf den Anfang des Block zurückrollen können muss, ist es nicht erlaubt, ein RetryTXN innerhalb eines anderen RetryTXN-Blocks zu schachteln. Anderenfalls würde das innere RetryTXN die Transaktion des äußeren RetryTXN unterbrechen und der Zustand wäre nicht mehr rückrollbar.

Die Deadlocks und Lock-Timeouts werden auf dem cx.txn.retry-Logger geloggt.

Schleifenbefehle

Da RetryTXN wie eine while-Schleife betrachtet werden kann, die den Codeblock so oft ausführt, bis die Transaktion erfolgreich durchläuft (so ist RetryTXN intern auch implementiert), ist die Semantik einiger Schleifenbefehle auch für RetryTXN definiert.

  • Index liefert die Anzahl wie oft der RetryTXN-Block bereits wiederholt wurde (erster Durchlauf = 0)
  • break beendet die Transaktion1 und verlässt den RetryTXN-Block. Die Ausführung wird beim ersten Statement nach dem Block fortgesetzt.
  • return beendet die Transaktion1 und verlässt anschließend die umschließende Prozedur/Message des RetryTXN-Blocks. 
  • cancel beendet die Transaktion1 und anschließend die aktuelle InstantView-Abarbeitung.
  • continue ist innerhalb von RetryTXN nicht erlaubt und liefert eine Fehlermeldung. Per Definition müsste continue die aktuelle Transaktion abbrechen und den Block erneut ausführen, jedoch soll RetryTXN die Transaktion nur für spezielle Transaktionsabbrüche wiederholen. Da zudem der Nutzen von continue innerhalb RetryTXN fraglich ist, wird diese Semantik nicht unterstützt.

1= Die Transaktion muss beim Verlassen des Blocks beendet werden, da RetryTXN garantiert, dass er Block entweder ganz oder gar nicht ausgeführt wird. Wird er durch Steuerbefehle verlassen, dann ist die Ausführung des Blocks beendet und die Transaktion muss ebenfalls beendet werden.

Transaktionsbefehle
  • RetryTXN ist innerhalb von RetryTXN nicht erlaubt, da das innere RetryTXN die Transaktion des äußeren RetryTXNs neu starten müsste, was verhindern würde, dass das äußere RetryTXN den Zustand an den Anfang des Blocks zurückrollen kann.
  • EndTXN ist innerhalb von RetryTXN ebenfalls nicht erlaubt, da dies die Transaktion des RetryTXN-Blocks beenden würde und der Zustand nicht mehr zurückrollbar wäre. Die Transaktion des RetryTXN-Blocks lässt sich nur durch Verlassen des Blocks (break) beenden.
  • AbortTXN ist innerhalb von RetryTXN erlaubt, führt jedoch ein implizites cancel im Anschluss aus, da AbortTXN meist im Fehlerfall verwendet wird und der RetryTXN-Block verlassen werden muss, da jeder weitere Befehl eine neue Transaktion öffnen könnte, die dann nicht mehr zurückrollbar wäre.

 

Codebeispiel:

RetryTXN(DEADLOCK(5), LOCK_TIMEOUT(1)) // = EndTXN+BeginTXN { RetryTXN // error! not allowed! {} EndTXN // error! EndTXN here not allowed break // = EndTXN+break return // = EndTXN+return cancel // = EndTXN+cancel continue // error! continue not allowed inside RetryTXN error if { AbortTXN // = AbortTXN+cancel } CreatePersObject(CX_PERSON) "John" Over Put(firstName) "Doe" Over Put(name) Index // = index of current retry } // = EndTXN "Completed!" Attention(,INFO)

 

Verwandte Themen