`inventorySetQuantities` ミューテーションにおける在庫更新のcompare-and-swap処理の改善

Shopifyの開発者の皆さん、こんにちは。今回はShopifyの在庫管理における重要な機能、`inventorySetQuantities`ミューテーションの改良についてお伝えします。

技術的課題と現状分析

これまでの`inventorySetQuantities`ミューテーションでは、在庫の同時更新を行う際に「compare-and-swap」機能を使用してきました。しかし、これは在庫数量の比較チェックを行うか否かを明示的に選択する仕組みがありませんでした。これにより、在庫更新の直感性や効率性に課題がありました。

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

この問題を解決するため、`inventorySetQuantities`ミューテーションにおけるcompare-and-swap機能が強化されました。新たに`changeFromQuantity`フィールドが追加され、在庫数量の比較チェックを行うか否かを明示的に選択できるようになりました。

なお、`compareQuantity`と`ignoreCompareQuantity`フィールドは今後非推奨となり、利用が廃止されます。

実装手順とコード例

新しいフィールドの使用方法を解説します。比較チェックをバイパスする場合、以前は`ignoreCompareQuantity`を`true`に設定していました。しかし、新たな仕組みでは、比較チェックをバイパスするには`changeFromQuantity`フィールドに明示的に`null`を渡します。チェックを有効にするには、更新前の初期数量を表す整数を渡します。

以下に具体的なコードの例を示します。この例では、現在の在庫数量が5である場合にのみ、新しい在庫数量を12に設定します。もし他のプロセスがその間に数量を変更した場合、エラーが返りますので、更新された値で再試行してください。


  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
      }
    }
  }

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

`changeFromQuantity`フィールドを使用することで、在庫の同時更新が直感的に行え、エラーハンドリングも容易になります。これにより、開発効率と在庫管理の信頼性が向上します。

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

なお、`compareQuantity`と`ignoreCompareQuantity`フィールドはバージョン`2026-01`で非推奨となり、バージョン`2026-04`から完全に削除される予定です。そのため、早めに新しいフィールドへの移行をお勧めします。

次のステップ・発展案

比較チェックのオプトアウトについては、適切なユースケースがある場合に限り、使用することを推奨します。詳細については公式ドキュメントをご覧ください。

参考記事: Improved compare and swap inventory updates for the `inventorySetQuantities` mutation