Operazioni batch transazionali in Azure Cosmos DB

SI APPLICA A: NoSQL

Il batch transazionale descrive un gruppo di operazioni di punto che devono avere esito positivo o negativo insieme alla stessa chiave di partizione in un contenitore. Le operazioni vengono definite, aggiunte al batch e il batch viene eseguito. Se tutte le operazioni hanno esito positivo nell'ordine in cui sono descritte nell'operazione batch transazionale, verrà eseguito il commit della transazione. Tuttavia, se un'operazione non riesce, viene eseguito il rollback dell'intera transazione.

Che cos'è una transazione in Azure Cosmos DB

Una transazione in un tipico database può essere definita come una sequenza di operazioni eseguite come singola unità di lavoro logica. Ogni transazione fornisce garanzie di proprietà ACID (Atomicità, Coerenza, Isolamento, Durabilità).

  • L'atomicità garantisce che tutte le operazioni eseguite nell'ambito di una transazione siano trattate come unità singola e che venga eseguito il commit di tutte le operazioni o di nessuna di esse.
  • La coerenza garantisce che i dati siano sempre in uno stato valido in tutte le transazioni.
  • L'isolamento garantisce che non vi siano transazioni conflittuali. La maggior parte dei sistemi commerciali offre più livelli di isolamento utilizzabili in base alle esigenze dell'applicazione.
  • La durabilità assicura che qualsiasi modifica di cui sia stato eseguito il commit in un database sia sempre presente. Azure Cosmos DB supporta transazioni conformi ad ACID complete con isolamento degli snapshot per le operazioni all'interno della stessa chiave di partizione logica.

Operazioni e stored procedure batch transazionali

Azure Cosmos DB supporta attualmente le stored procedure, che forniscono anche l'ambito transazionale per le operazioni. Tuttavia, le operazioni batch transazionali offrono i vantaggi seguenti:

  • Opzione lingua: batch transazionale è supportato nell'SDK e nel linguaggio già in uso, mentre le stored procedure devono essere scritte in JavaScript.
  • Controllo delle versioni del codice: controllo delle versioni del codice dell'applicazione con onboarding nella pipeline CI/CD molto più naturale rispetto all'orchestrazione dell'aggiornamento di una stored procedure per poi doversi assicurare che il rollover avvenga al momento giusto. Semplifica anche il rollback delle modifiche.
  • Prestazioni: riduzione della latenza per le operazioni equivalenti fino al 30% rispetto all'esecuzione della stored procedure.
  • Serializzazione del contenuto: ogni operazione all'interno di un batch transazionale può usare opzioni di serializzazione personalizzate per il relativo payload.

Come creare un'operazione batch transazionale

Quando si crea un'operazione batch transazionale, iniziare con un'istanza del contenitore e chiamare CreateTransactionalBatch:

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

TransactionalBatch batch = container.CreateTransactionalBatch(partitionKey);

Aggiungere quindi più operazioni al batch:

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

Infine, chiamare ExecuteAsync nel batch:

using TransactionalBatchResponse response = await batch.ExecuteAsync();

Una volta ricevuta la risposta, esaminare se abbia avuto esito positivo. Se la risposta indica un esito positivo, estrarre i risultati:

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

Importante

Se si verifica un errore, l'operazione non riuscita avrà un codice di stato dell'errore corrispondente. Tutte le altre operazioni avranno un codice di stato 424 (dipendenza non riuscita). Se l'operazione non riesce perché tenta di creare un elemento già esistente, viene restituito un codice di stato 409 (conflitto). Il codice di stato consente di identificare la causa dell'errore della transazione.