Verhindern doppelter Datenbanktransaktionen

Wenn eine aufrufende Anwendung eine Anforderung mit einem Commit an die Datenbank stellt, möchte die Anwendung unter bestimmten Umständen sicherstellen, dass die Anforderung nur einmal verarbeitet wird. Die aufrufende Anwendung kann dies über den GW-DBTransaction-ID-Header tun.

Der GW-DBTransaction-ID-Header identifiziert eine Transaktions-ID (eine Zeichenfolge mit bis zu 128 Zeichen). Bei Übermittlung mit einem System-API-Aufruf versucht die System-API, den Wert in die TransactionID-Tabelle der Datenbank einzufügen.

  • Wenn der Wert nicht bereits in der Tabelle vorhanden ist, ist das Einfügen erfolgreich. Die System-API geht davon aus, dass die Transaktion noch nicht per Commit übergeben wurde, und der Aufruf wird wie gewohnt verarbeitet.
  • Wenn der Wert in der Tabelle vorhanden ist, schlägt das Einfügen fehl. Die System-API geht davon aus, dass die Transaktion bereits per Commit übergeben wurde, und der Aufruf wird abgelehnt. Die System-API gibt einen 400-Statuscode mit einem gw.api.webservice.exception.AlreadyExecutedException-Fehler zurück.

Für den erfolgreichen Aufruf muss die im Header angegebene Transaktions-ID global eindeutig für alle Clients, APIs und Webdienste sein.

Der GW-DBTransaction-ID-Header hat folgende Einschränkungen:

  • Er funktioniert nur mit System-APIs, die Daten per Commit an die Datenbank übergeben.
  • Er funktioniert nur, wenn die System-API nur einmal einen Commit ausführt. (System-APIs, die mehrmals per Commit übergeben werden, sind selten.)
  • Sie funktioniert nur, wenn der Commit entweder die einzige Nebenwirkung des Aufrufs ist oder wenn der Commit vor allen anderen Nebeneffekten erfolgt, z. B. dem Senden von Benachrichtigungen an externe Systeme.

Doppelte Anforderungen geben keine identischen Antworten zurück. Die erste Anforderung ist erfolgreich, aber nachfolgende Anforderungen schlagen fehl. Es liegt in der Verantwortung der aufrufenden Anwendung, zu entscheiden, wie oder ob diese Situation behandelt wird.