Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
ОБЛАСТЬ ПРИМЕНЕНИЯ: 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 (конфликт). Код состояния позволяет понять причину сбоя всей транзакции.