Operações em lote transacionais no Azure Cosmos DB

APLICA-SE A: NoSQL

O lote transacional descreve um grupo de operações pontuais que precisam ser bem-sucedidas ou falhar junto com a mesma chave de partição em um contêiner. As operações são definidas, adicionadas ao lote e o lote é executado. Se todas as operações forem bem-sucedidas na ordem em que estão descritas na operação de lote transacional, a transação será confirmada. No entanto, se alguma operação falhar, toda a transação será revertida.

O que é uma transação no Azure Cosmos DB

Uma transação em um banco de dados típico pode ser definida como uma sequência de operações executadas como uma única unidade lógica de trabalho. Cada transação fornece garantias de propriedade ACID (Atomicidade, Consistência, Isolamento, Durabilidade).

  • A atomicidade garante que todas as operações realizadas dentro de uma transação são tratadas como uma única unidade, e todas elas estão comprometidas ou nenhuma delas está.
  • A consistência garante que os dados estejam sempre em um estado válido nas transações.
  • O isolamento garante que nenhuma transação interfira uma com a outra – muitos sistemas comerciais fornecem vários níveis de isolamento que podem ser usados com base nas necessidades do aplicativo.
  • A durabilidade garante que qualquer alteração confirmada em um banco de dados esteja sempre presente. O Azure Cosmos DB dá suporte a transações totalmente compatíveis com ACID com isolamento de instantâneo para operações dentro da mesma chave de partição lógica.

Operações em lote transacionais e procedimentos armazenados

Atualmente, o Azure Cosmos DB dá suporte a procedimentos armazenados, que também fornecem o escopo transacional em operações. No entanto, as operações em lote transacionais oferecem os seguintes benefícios:

  • Opção de idioma – O lote transacional é suportado no SDK e no idioma com o qual você já trabalha, enquanto os procedimentos armazenados precisam ser escritos em JavaScript.
  • Controle de versão de código – Versionar o código do aplicativo e integrá-lo ao seu pipeline de CI/CD é muito mais natural do que orquestrar a atualização de um procedimento armazenado e garantir que a substituição aconteça no momento certo. Também facilita a reversão de alterações.
  • Desempenho – Reduziu a latência em operações equivalentes em até 30% em comparação com a execução do procedimento armazenado.
  • Serialização de conteúdo – Cada operação dentro de um lote transacional pode usar opções de serialização personalizadas para sua carga útil.

Como criar uma operação em lote transacional

Ao criar uma operação em lote transacional, comece com uma instância de contêiner e chame CreateTransactionalBatch:

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

TransactionalBatch batch = container.CreateTransactionalBatch(partitionKey);

Em seguida, adicione várias operações ao lote:

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

Finalmente, chame ExecuteAsync no lote:

using TransactionalBatchResponse response = await batch.ExecuteAsync();

Uma vez recebida a resposta, verifique se a resposta foi bem-sucedida. Se a resposta indicar um sucesso, extraia os resultados:

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 houver uma falha, a operação com falha terá um código de status de seu erro correspondente. Todas as outras operações terão um código de status 424 (dependência com falha). Se a operação falhar porque tenta criar um item que já existe, um código de status de 409 (conflito) será retornado. O código de status permite identificar a causa da falha da transação.