OCAPI 楽観的ロック 23.1

OCAPI では、データ整合性のために 2 つの独立したレベルの楽観的ロックがサポートされています。1 つ目のレベルは、Commerce Cloud Digital のデーターレイヤー自体に組み込まれています。2 つ目のレベルは、Open Commerce API のオプション機能です。

Digital は、データレイヤーで幅広い範囲のリソースに楽観的ロックを使用します。この機能の調整や無効化はできません。これにより、同時実行スレッドが互いの変更を誤って上書きすること (失われた更新問題) を防止します。

データレイヤーでは、各同時実行スレッドは既知のオブジェクト状態を基に動作します。あるスレッドがオブジェクト状態を変更する際に、別のスレッドが同時にオブジェクト状態を変更してからトランザクション内でその変更をコミットしようとすると、例外が発生します。

この例外は、さまざまな Commerce Cloud API (Digital Script API や OCAPI など) で表示されます。OCAPI では、この例外は HTTP 409 (Conflict) ConcurrentModificationException フォールトとして表示されます。

ほとんどの場合、このフォールトはタイミングによる問題で引き起こされるため、お使いのクライアントアプリケーションでのこのフォールトに対する最も簡単な対処方法は、単に OCAPI 呼び出しを再試行することです。

ただし、複雑なケースでは単に再試行しても機能しないことがあります。特に、あるリソースの操作が暗黙的に別のリソースにタッチする場合などです。例:

  • ProductCategoryAssignments、BundledProducts、Variations、VariationGroups、および ProductSets のリソース更新が暗黙的に上位 Product リソースにタッチする場合。
  • Profile リソースの更新が暗黙的に Customer リソースにタッチする場合。
  • ProductListItem、Registrant、および Address のリソース更新が暗黙的に ProductList リソースにタッチする場合。

このような複雑なケースでは、(フックなど) カスタマイズを含むジョブや、ストアフロント/アプリケーションを詳細に調べて解決方法を見つけることが必要な場合があります。

楽観的ロックの例外が発生する典型的なシナリオは以下のとおりです:

  • OCAPI リクエストの同時実行
  • Script API パイプライン/コントローラーリクエストの同時実行
  • OCAPI リクエストと Script API リクエストの同時実行
  • OCAPI リクエスト、Script API リクエスト、およびジョブ実行の同時実行

リソースの状態の概念によって、OCAPI で条件付きリクエストを介して楽観的ロックを使用できます。お使いのクライアントアプリケーションが、同じリソースの同時更新を明示的にサポートする場合は、リソースの状態の使用をお勧めします。この概念は、データベーストランザクションのみならず、HTTP リクエスト/レスポンスの全体的なフローを対象としています。リソースの状態によって、ConcurrentModificationExceptions の可能性を減らすことができますが、完全に防止することはできません。