Transaktionella batchåtgärder i Azure Cosmos DB

GÄLLER FÖR: NoSQL

Transaktionsbatch beskriver en grupp punktåtgärder som antingen måste lyckas eller misslyckas tillsammans med samma partitionsnyckel i en container. Åtgärder definieras, läggs till i batchen och batchen körs. Om alla åtgärder lyckas i den ordning de beskrivs i den transaktionella batchåtgärden kommer transaktionen att genomföras. Men om någon åtgärd misslyckas återställs hela transaktionen.

Vad är en transaktion i Azure Cosmos DB

En transaktion i en typisk databas kan definieras som en sekvens med åtgärder som utförs som en enda logisk arbetsenhet. Varje transaktion ger acid-egenskapsgarantier (Atomicity, Consistency, Isolation, Durability).

  • Atomicitet garanterar att alla åtgärder som utförs i en transaktion behandlas som en enda enhet, och antingen är alla incheckade eller ingen av dem.
  • Konsekvens säkerställer att data alltid är i ett giltigt tillstånd mellan transaktioner.
  • Isolering garanterar att inga två transaktioner stör varandra – många kommersiella system tillhandahåller flera isoleringsnivåer som kan användas baserat på programmets behov.
  • Hållbarhet säkerställer att alla ändringar som görs i en databas alltid kommer att finnas. Azure Cosmos DB stöder fullständiga ACID-kompatibla transaktioner med ögonblicksbildisolering för åtgärder inom samma logiska partitionsnyckel.

Transaktionella batchåtgärder och lagrade procedurer

Azure Cosmos DB stöder för närvarande lagrade procedurer, vilket även ger transaktionsomfånget för åtgärder. Transaktionella batchåtgärder erbjuder dock följande fördelar:

  • Språkalternativ – Transaktionsbatch stöds på det SDK och språk som du redan arbetar med, medan lagrade procedurer måste skrivas i JavaScript.
  • Kodversionshantering – Versionshantering av programkod och registrering på DIN CI/CD-pipeline är mycket mer naturligt än att samordna uppdateringen av en lagrad procedur och se till att rollover sker vid rätt tidpunkt. Det gör det också enklare att återställa ändringar.
  • Prestanda – Kortare svarstid för motsvarande åtgärder med upp till 30 % jämfört med körningen av den lagrade proceduren.
  • Innehållsserialisering – Varje åtgärd i en transaktionsbatch kan använda anpassade serialiseringsalternativ för nyttolasten.

Så här skapar du en transaktionsbatchåtgärd

När du skapar en transaktionell batchåtgärd börjar du med en containerinstans och anropar CreateTransactionalBatch:

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

TransactionalBatch batch = container.CreateTransactionalBatch(partitionKey);

Lägg sedan till flera åtgärder i batchen:

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

Anropa slutligen ExecuteAsync på batchen:

using TransactionalBatchResponse response = await batch.ExecuteAsync();

När svaret har tagits emot undersöker du om svaret lyckas. Om svaret indikerar ett lyckat resultat extraherar du resultatet:

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

Viktigt!

Om det uppstår ett fel har den misslyckade åtgärden statuskoden för motsvarande fel. Alla andra åtgärder har statuskoden 424 (misslyckat beroende). Om åtgärden misslyckas eftersom den försöker skapa ett objekt som redan finns returneras en statuskod på 409 (konflikt). Statuskoden gör det möjligt för en att identifiera orsaken till transaktionsfelet.