Azure Cosmos DB でのトランザクション バッチ操作

適用対象: NoSQL

トランザクション バッチでは、コンテナー内の同じパーティション キーと共に成功または失敗のいずれかになる必要があるポイント操作のグループを記述します。 操作を定義し、バッチに追加して、そのバッチを実行します。 すべての操作がトランザクション バッチ操作内で記述されている順序で成功した場合、トランザクションはコミットされます。 ただし、いずれかの操作が失敗した場合、トランザクション全体がロールバックされます。

Azure Cosmos DB のトランザクションとは

一般的なデータベースにおけるトランザクションは、作業の単一の論理ユニットとして実行される一連の操作として定義されます。 各トランザクションによって、ACID (原子性、一貫性、分離性、持続性) プロパティの保証が提供されます。

  • 原子性は、トランザクション内で実行されるすべての操作が単一の単位として扱われることを保証します。その結果は、そのすべてがコミットされるか、まったくコミットされないかのどちらかになります。
  • 一貫性は、トランザクションにまたがってデータが常に有効な状態にあることを保証します。
  • 分離性は、2 つのトランザクションが互いに干渉しないことを保証します。多くの商用システムは、アプリケーション ニーズに基づいて使用できる複数の分離性レベルを提供します。
  • 持続性は、データベース内でコミットされたすべての変更が常に保持されることを保証します。 Azure Cosmos DB では、同じ論理パーティション キー内の操作に対して、スナップショット分離が有効な ACID に完全に準拠するトランザクションをサポートします。

トランザクション バッチ操作とストアド プロシージャ

Azure Cosmos DB では現在、ストアド プロシージャをサポートしています。これにより、操作のトランザクション スコープも提供されます。 ただし、トランザクション バッチ操作には次のような利点があります。

  • 言語オプション - トランザクション バッチは、既に使用している SDK と言語でサポートされていますが、ストアド プロシージャは JavaScript で記述される必要があります。
  • コードのバージョン管理 - アプリケーション コードのバージョン管理と CI/CD パイプラインにオンボードすることは、ストアド プロシージャの更新を調整し、適切なタイミングでロールオーバーが発生するように設定することよりもはるかに自然です。 また、変更のロールバックも容易になります。
  • パフォーマンス - ストアド プロシージャの実行と比較すると、同等の操作における待機時間が最大で 30% 短縮されました。
  • コンテンツのシリアル化 - トランザクション バッチ内の各操作で、そのペイロードのカスタム シリアル化オプションを使用できます。

トランザクション バッチ操作を作成する方法

トランザクション バッチ操作を作成する場合、コンテナー インスタンスから開始し、CreateTransactionalBatch を呼び出します。

PartitionKey partitionKey = new PartitionKey("road-bikes");

TransactionalBatch batch = container.CreateTransactionalBatch(partitionKey);

次に、複数の操作をバッチに追加します。

Product bike = new (
    id: "68719520766",
    category: "road-bikes",
    name: "Chropen Road Bike"
);

batch.CreateItem<Product>(bike);

Part part = new (
    id: "68719519885",
    category: "road-bikes",
    name: "Tronosuros Tire",
    productId: bike.id
);

batch.CreateItem<Part>(part);

最後に、バッチで ExecuteAsync を呼び出します。

using TransactionalBatchResponse response = await batch.ExecuteAsync();

応答を受信した後、その応答が成功かどうかを調べます。 応答が成功を示している場合は、結果を抽出します。

if (response.IsSuccessStatusCode)
{
    TransactionalBatchOperationResult<Product> productResponse;
    productResponse = response.GetOperationResultAtIndex<Product>(0);
    Product productResult = productResponse.Resource;

    TransactionalBatchOperationResult<Part> partResponse;
    partResponse = response.GetOperationResultAtIndex<Part>(1);
    Part partResult = partResponse.Resource;
}

重要

エラーが発生した場合は、失敗した操作に対応するエラーの状態コードが表示されます。 その他すべての操作では 424 状態コード (依存関係の失敗) が表示されます。 既に存在する項目を作成しようとして操作が失敗した場合は、状態コード 409 (競合) が返されます。 状態コードにより、トランザクション エラーの原因を特定できます。