`inventorySetQuantities` ミューテーションの新たな比較交換構文

Shopifyプラス導入企業の技術責任者、Shopify開発の中級エンジニアの皆様、新しいAPIの変更が行われました。`inventorySetQuantities`ミューテーションにおいて新たな比較交換(Compare and Swap)構文が導入されました。

技術的課題の定義

これまで`inventorySetQuantities`ミューテーションは、`compareQuantity`と`ignoreCompareQuantity`というフィールドを利用して在庫数量の変更を管理していました。しかし、この変更により、それらのフィールドが削除され、新たに`changeFromQuantity`フィールドが必須となりました。これにより在庫数量の同時更新に対するトランザクション保護が強化されています。

技術的ソリューションの提案

新しい`changeFromQuantity`フィールドは、更新前の在庫数量を入力することで、その数量が正しい場合のみ更新が行われるという方法を採用しています。これにより、他のプロセスによる在庫数量の変更を確実に検知し、更新を行うことが可能となりました。

実装手順とコード例

`changeFromQuantity`フィールドを使うには、以下のように引数に追加します:


mutation {
    inventorySetQuantities(
      input: {
      quantities: [
        {
          quantity: 12,
          inventoryItemId: "gid://shopify/InventoryItem/2",
          locationId: "gid://shopify/Location/1",
          changeFromQuantity: 5
        }
      ],
      reason: "correction",
      name: "available"
    }
    ) {
      inventoryAdjustmentGroup {
        id
      }
      userErrors {
        code
        message
      }
    }
  }

上記の場合、在庫数量が5であることを期待して更新を試みます。もし他のプロセスにより在庫数量が変更されていた場合、エラーが返され、その後再度更新を試みることが可能となります。

パフォーマンス・コスト分析

この新たなフィールドの導入により、同時に在庫数量の更新を行う複数のプロセスを正確に管理することが可能となりました。これにより、在庫の二重引き当てなどのエラーを防ぐことができ、ビジネスの信頼性を向上させることができます。

実装時の注意点・ベストプラクティス

`changeFromQuantity`フィールドはスキーマレベルでは必須ではないですが、このフィールドをnullまたは現在の実際の数量を指定せずに呼び出すとエラーが発生します。

`ignoreCompareQuantity`と`compareQuantity`を削除することを忘れないでください。同時に、比較チェックをスキップする場合は`changeFromQuantity: null`を明示的に渡す必要があります。

次のステップ・発展案

この変更は、バージョン`2026-04`にて適用されます。そのため、それ以前にあなたのアプリケーションロジックを更新し、新たなフィールドを適切に使用できるように準備してください。

参考記事: New compare and swap syntax for the `inventorySetQuantities` mutation