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

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

Что такое транзакция в 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;
}

Important

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

Выполнение транзакционных пакетных операций

При выполнении пакета транзакций все операции в пакете транзакций группируются, сериализуются в одну полезную нагрузку и отправляются в виде одного запроса в службу Azure Cosmos DB.

Служба получает запрос и выполняет все операции в области транзакций и возвращает ответ с помощью одного протокола сериализации. Этот ответ представляет собой либо успешное выполнение, либо сбой и предоставляет отдельные ответы для каждой операции.

Пакет SDK предоставляет ответ для проверки результата и, при необходимости, извлекает каждый из результатов внутренней операции.

Ограничения

В настоящее время существует два известных ограничения:

  • Ограничение размера запроса Azure Cosmos DB ограничивает размер полезных данных пакетной обработки транзакций, не превышающих 2 МБ, и максимальное время выполнения составляет 5 секунд.
  • В настоящий момент существует ограничение в 100 операций на транзакционный пакет, чтобы обеспечить производительность в соответствии с ожиданиями и SLA.

Следующий шаг