Compartilhar via


Operações em lotes transacionais no Azure Cosmos DB

APLICA-SE A: NoSQL

O lote transacional descreve um grupo de operações de ponto que precisam ou 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 são bem-sucedidas na ordem em que são descritas na operação de lote transacional, a transação é confirmada. No entanto, se qualquer 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 realizadas 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 feitas dentro de uma transação sejam tratadas como uma unidade: ou todas elas são confirmadas, ou nenhuma o é.
  • A consistência assegura que os dados estejam sempre em um estado válido entre as transações.
  • O isolamento garante que duas transações não interfiram uma com a outra - muitos sistemas comerciais fornecem vários níveis de isolamento que podem ser usados com base nas necessidades de cada aplicativo.
  • A durabilidade cuida para que qualquer alteração confirmada em um banco de dados esteja sempre presente. O Azure Cosmos DB dá suporte a transações totalmente conformes a ACID com isolamento de instantâneo para operações dentro da mesma chave de partição lógica.

Operações transacionais em lote e procedimentos armazenados

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

  • Opção de linguagem - o lote transacional tem suporte no SDK e na linguagem com a qual você já trabalha, ao passo que os procedimentos armazenados precisam ser escritos em JavaScript.
  • Controle de versão de código - Codificar o aplicativo de controle de versão e integrá-lo ao pipeline de CI/CD é muito mais natural do que orquestrar a atualização de um procedimento armazenado e garantir que a sobreposição ocorra no momento certo. Isso também facilita a reversão de alterações.
  • Desempenho - latência reduzida de até 30% em operações equivalentes quando comparada com a execução do procedimento armazenado.
  • Serialização de conteúdo: cada operação em um lote transacional pode usar as opções de serialização personalizada para o payload.

Como criar uma operação transacional em lote

Ao criar uma operação transacional em lote, 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);

Por fim, chame ExecuteAsync no lote:

using TransactionalBatchResponse response = await batch.ExecuteAsync();

Ao receber a resposta, examine se ela foi bem-sucedida. Se ela tiver sido, 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á o código de status do respectivo erro. Todas as outras operações terão um código de status 424 (dependência com falha). Se a operação falhar porque ela tenta criar um item que já existe, um código de status 409 (conflito) será retornado. O código de status permite que se identifique a causa da falha da transação.