Share via


Azure Cosmos DB 中的交易式批次作業

適用於:NoSQL

交易式批次描述一組點作業,這些點作業需要與容器中的相同分割區索引鍵一起成功或失敗。 作業會定義、新增至批次,並執行批次。 如果所有作業都依交易式批次作業內描述的順序成功,則交易將會得到認可。 不過,如果任何作業失敗,則會復原整個交易。

什麼是 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;
}

重要

如果失敗,失敗的作業會有其對應錯誤的狀態碼。 所有其他作業都會有 424 狀態碼 (失敗的相依性)。 如果作業因嘗試建立已存在的項目而失敗,則會傳回狀態碼 409 (衝突)。 狀態碼會啟用一個,以識別交易失敗的原因。