Транзакционные пакетные операции в Azure Cosmos DB

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

Транзакционный пакет описывает группу точечных операций, которые должны либо полностью успешно выполняться для некоторого ключа секции в контейнере, либо все вместе завершаться сбоем. Операции определяются, добавляются в пакет и выполняются пакет. Если все операции будут выполнены успешно в том порядке, в котором они описаны в транзакционной пакетной операции, транзакция будет зафиксирована. Но при сбое любой отдельной операции выполняется откат всей транзакции.

Что такое транзакция в Azure Cosmos DB

Транзакции в обычной базе данных можно определить как последовательность отдельных операций, выполняемых как единая логическая единица работы. Каждая транзакция предоставляет гарантии соблюдения свойств ACID (атомарность, согласованность, изолированность, устойчивость).

  • Атомарность гарантирует, что все операции в транзакции рассматриваются как единое целое и могут быть успешно зафиксированы только в комплексе.
  • Согласованность гарантирует, что данные между транзакциями всегда находятся в допустимом состоянии.
  • Изолированность гарантирует, что никакие две транзакции не будут мешать друг другу. Многие коммерческие системы поддерживают несколько уровней изолированности для разных сценариев и потребностей приложений.
  • Устойчивость гарантирует, что любое зафиксированное в базе данных изменение всегда будет в ней присутствовать. Azure Cosmos DB поддерживает полностью соответствующие стандарту ACID транзакции с изоляцией моментальных снимков для операций в пределах одного ключа логической секции.

Транзакционные пакетные операции и хранимые процедуры

Azure Cosmos DB в настоящее время поддерживает хранимые процедуры, которые также обеспечивают транзакционную область действия для операций. Но транзакционные пакетные операции имеют по сравнению с ними несколько преимуществ:

  • Выбор языка — транзакционный пакет поддерживается в пакете SDK для любого языка, с которым вы уже работаете, а хранимые процедуры можно создать только на JavaScript.
  • Управление версиями кода — управление версиями кода приложения и его подключение к конвейеру CI/CD выполняются намного проще, чем оркестрация обновлений в хранимой процедуре и запуск выделения в строго определенное время. Кроме того, так проще выполнять откат изменений.
  • Производительность — уменьшение задержки до 30 % по сравнению с выполнением эквивалентных операций в хранимой процедуре.
  • Сериализация содержимого. Каждая операция в транзакционном пакете может использовать для полезных данных настраиваемые параметры сериализации.

Создание транзакционной пакетной операции

Для создания транзакционной пакетной операции потребуется пустой экземпляр контейнера, для которого нужно вызвать CreateTransactionalBatch:

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

TransactionalBatch batch = container.CreateTransactionalBatch(partitionKey);

Затем добавьте в этот пакет несколько операций:

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

Наконец, вызовите для пакета ExecuteAsync:

using TransactionalBatchResponse response = await batch.ExecuteAsync();

Проверьте успешность выполнения в полученном ответе. Если ответ указывает на успешное выполнение, извлеките результаты:

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

Внимание

В случае сбоя проблемная операция возвращает код состояния с обозначением ошибки. Все остальные операции получат код состояния 424 (сбой зависимости). Если операция завершается ошибкой, так как она пытается создать уже существующий элемент, возвращается код состояния 409 (конфликт). Код состояния позволяет понять причину сбоя всей транзакции.