共用方式為


Azure Cosmos DB 中的交易批處理操作

交易批次是指一組點操作,這些操作在具有相同分割鍵的容器中需要共同成功或失敗。 定義操作,將其加入批次,然後執行該批次。 如果所有操作依照交易批次操作中描述的順序成功,交易即被提交。 然而,若有任何操作失敗,整個交易會被回滾。

Azure Cosmos DB 中的交易是什麼?

典型資料庫中的交易可定義為作為單一邏輯工作單元執行的一系列操作。 每筆交易都提供 ACID(原子性、一致性、隔離性與耐久性)特性保證。

  • 原子性 保證交易中所有操作都被視為單一單位,且要麼全部提交,要麼都不提交。
  • 一致性 確保資料在交易間始終處於有效狀態。
  • 隔離 確保沒有兩筆交易互相干擾。 許多商用系統提供多種隔離等級,可依應用需求使用。
  • 持久性 確保資料庫中任何已提交的變更都始終存在。

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

這很重要

如果發生失敗,失敗的操作會顯示對應錯誤的狀態碼。 其他操作的 HTTP 狀態碼統一為 424(依賴失敗)。 若操作失敗,因為嘗試建立已存在的項目,則回傳 409(衝突)狀態碼。 狀態碼可以讓你找出交易失敗的原因。

交易批次操作的執行方式

當交易批次執行時,交易批次中的所有操作會被分組、序列化成單一有效載荷,並以單一請求發送給 Azure Cosmos 資料庫服務。

服務接收請求並執行交易範圍內的所有操作,並使用相同的序列化協定回傳回應。 此回應可視為成功或失敗,並提供每個操作的個別操作回應。

SDK 會公開回應,讓你驗證結果,並可選擇性地擷取每個內部操作結果。

局限性

目前已知有兩個限制:

  • Azure Cosmos DB 的請求大小限制限制了交易批次有效載荷的大小不得超過 2 MB,且最大執行時間為 5 秒。
  • 目前每個交易批次有 100 次操作的限制,以確保效能符合預期且符合 SLA。

後續步驟