Transaktionale Batchvorgänge in Azure Cosmos DB

GILT FÜR: NoSQL

Ein transaktionaler Batch bezeichnet eine Gruppe von Punktvorgängen, die zusammen mit dem gleichen Partitionsschlüssel in einem Container entweder erfolgreich oder fehlerhaft ausgeführt werden müssen. Vorgänge werden definiert, zum Batch hinzugefügt, und der Batch wird ausgeführt. Wenn alle Vorgänge in der Reihenfolge, in der sie im transaktionalen Batchvorgang beschrieben sind, erfolgreich ausgeführt werden, wird für die Transaktion ein Commit ausgeführt. Wenn jedoch ein Vorgang fehlschlägt, wird für die gesamte Transaktion ein Rollback ausgeführt.

Was ist eine Transaktion in Azure Cosmos DB?

Eine Transaktion in einer typischen Datenbank kann als Folge von Vorgängen definiert werden, die als einzige logische Arbeitseinheit ausgeführt werden. Jede Transaktion bietet ACID-Eigenschaftsgarantien (Atomarität, Konsistenz, Isolation, Dauerhaftigkeit).

  • Die Atomarität bzw. Unteilbarkeit gewährleistet, dass alle innerhalb einer Transaktion ausgeführten Vorgänge als eine einzige Einheit betrachtet werden und entweder alle Vorgänge committet werden oder keiner von ihnen.
  • Die Konsistenz stellt sicher, dass die Daten zwischen den Transaktionen immer einen gültigen Zustand aufweisen.
  • Die Isolation sorgt dafür, dass es niemals zu Konflikten zwischen zwei Transaktionen kommt. Viele kommerzielle Systeme bieten mehrere Isolationsstufen, die je nach Anforderungen der Anwendung genutzt werden können.
  • Die Dauerhaftigkeit stellt sicher, dass jede Änderung, die in einer Datenbank committet wird, immer vorhanden ist. Azure Cosmos DB unterstützt vollständige ACID-konforme Transaktionen mit Momentaufnahmenisolation für Vorgänge innerhalb desselben logischen Partitionsschlüssels.

Transaktionale Batchvorgänge und gespeicherte Prozeduren

Azure Cosmos DB unterstützt derzeit gespeicherte Prozeduren, die auch den Transaktionsbereich für Vorgänge bereitstellen. Transaktionale Batchvorgänge bieten jedoch die folgenden Vorteile:

  • Sprachoption: Transaktionale Batches werden im SDK und in der Sprache unterstützt, mit der Sie bereits arbeiten, während gespeicherte Prozeduren in JavaScript geschrieben werden müssen.
  • Codeversionsverwaltung: Die Versionsverwaltung von Anwendungscode und dessen Integration in die CI/CD-Pipeline ist wesentlich natürlicher als die Aktualisierung einer gespeicherten Prozedur zu orchestrieren und sicherzustellen, dass der Rollover zum richtigen Zeitpunkt erfolgt. Außerdem wird das Rollback von Änderungen vereinfacht.
  • Leistung: verringerte Latenz bei entsprechenden Vorgängen um bis zu 30 % im Vergleich zur Ausführung gespeicherter Prozeduren
  • Serialisierung von Inhalten: Jeder Vorgang in einem Transaktionsbatch kann benutzerdefinierte Serialisierungsoptionen für seine Nutzlast verwenden.

Erstellen eines transaktionalen Batchvorgangs

Beim Erstellen eines transaktionalen Batchvorgangs beginnen Sie mit einer Containerinstanz und rufen CreateTransactionalBatch auf:

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

TransactionalBatch batch = container.CreateTransactionalBatch(partitionKey);

Fügen Sie als Nächstes mehrere Vorgänge zum Batch hinzu:

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

Rufen Sie schließlich ExecuteAsync für den Batch auf:

using TransactionalBatchResponse response = await batch.ExecuteAsync();

Nachdem die Antwort empfangen wurde, überprüfen Sie, ob die Antwort erfolgreich war. Wenn die Antwort einen Erfolg angibt, extrahieren Sie die Ergebnisse:

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

Wichtig

Wenn ein Fehler auftritt, weist der fehlerhafte Vorgang einen Statuscode für den jeweiligen Fehler auf. Alle anderen Vorgänge weisen Statuscode 424 auf (Abhängigkeit mit Fehlern). Wenn der Vorgang fehlschlägt, weil versucht wird, ein bereits vorhandenes Element zu erstellen, wird der Statuscode 409 (Konflikt) zurückgegeben. Über die Statuscodes können Sie die Ursache eines Transaktionsfehlers ermitteln.