重複するデータベーストランザクションの回避

状況によっては、呼び出し元アプリケーションがデータベースへのコミットに関係する要求を作成している場合に、そのアプリケーションで要求を 1 度だけ処理することもできます。呼び出し元アプリケーションでは、GW-DBTransaction-ID ヘッダーを使用してこれを実行します。

GW-DBTransaction-ID ヘッダーはトランザクション ID (最大 128 文字の文字列)を識別します。Cloud API 呼び出しで送信されると、Cloud API はこの値をデータベースの TransactionID テーブルに挿入しようとします。

  • この値がテーブルにまだ存在していない場合は、挿入は成功します。Cloud API では、トランザクションがまだコミットされていないため、呼び出しが通常どおりに処理されると想定しています。
  • この値がテーブルに存在している場合は、挿入は失敗します。Cloud API では、トランザクションがすでにコミットされているため、呼び出しが拒否されると想定しています。Cloud API は、gw.api.webservice.exception.AlreadyExecutedException エラーとともにステータスコード 400 を返します。

呼び出しが成功するためには、ヘッダーに指定されているトランザクション ID がすべてのクライアント、API、および Web サービスにわたってグローバルに一意である必要があります。

GW-DBTransaction-ID ヘッダーには、以下の制限があります。

  • データをデータベースにコミットする Cloud API 呼び出しでのみ使用できます。
  • Cloud API が 1 回だけコミットする場合にのみ使用できます(複数回コミットを実行する Cloud API 呼び出しは稀です)。
  • コミットが呼び出しの副作用にすぎない場合、または、コミットが、外部システムへの通知の送信などのその他の副作用よりも前に発生する場合にのみ使用できます。

重複要求は同じ応答を返すわけではありません。最初の要求は成功しますが、それ以降の要求は失敗します。この状況の処理方法や処理すべきかどうかは、呼び出し元アプリケーションによって判断されます。