Создание пакета транзакций с помощью пакета SDK
Пакетные запросы транзакций позволяют выполнять несколько операций одновременно в одном ключе секции. Все операции выполняются в указанном порядке, и транзакция фиксируется только в том случае, если каждая операция завершается успешно. Если любая операция завершается ошибкой, все транзакции будут отменены. Рассмотрим вымышленный сценарий, где два использованных велосипедных аксессуара создаются в контейнере, изношенное седло и ржавый руль. Для простоты они имеют короткие уникальные идентификаторы и идентификаторы категорий.
Product saddle = new("0120", "Worn Saddle", "accessories-used");
Product handlebar = new("012A", "Rusty Handlebar", "accessories-used");
В этом примере мы также решили использовать определение общедоступной записи.
public record Product(string id, string name, string categoryId);
Класс Microsoft.Azure.Cosmos.Container имеет метод CreateTransactionalBatch, который создает новый экземпляр типа TransactionalBatch, поддерживающий упрощенный синтаксис. Этот пакет транзакций и методы fluent CreateItem могут использоваться для создания двухшаговой транзакции, которая вставляет два элемента в одно и то же значение ключа разбиения.
PartitionKey partitionKey = new ("accessories-used");
TransactionalBatch batch = container.CreateTransactionalBatch(partitionKey)
.CreateItem<Product>(saddle)
.CreateItem<Product>(handlebar);
Чтобы выполнить пакет, асинхронно вызовите метод ExecuteAsync . Добавьте инструкцию using, чтобы немедленно убедиться, что объект удаляется правильно после текущей области приложения.
using TransactionalBatchResponse response = await batch.ExecuteAsync();
Пакет транзакций поддерживает операции с тем же ключом логического раздела. Операции с разными ключами логических разделов завершаются ошибкой. В следующем примере пакет транзакций завершается сбоем с плохим запросом из-за наличия другого логического ключа секции.
Product saddle = new("0120", "Worn Saddle", "accessories-used");
Product handlebar = new("012C", "Pristine Handlebar", "accessories-new");
PartitionKey partitionKey = new ("accessories-used");
TransactionalBatch batch = container.CreateTransactionalBatch(partitionKey)
.CreateItem<Product>(saddle)
.CreateItem<Product>(handlebar);
Пакет транзакций также поддерживает широкий спектр операций с использованием синтаксического синтаксиса, включая, но не ограничивается:
Метод | Описание |
---|---|
CreateItemStream() |
Создание элемента из существующего потока |
DeleteItem() |
Удаление элемента |
ReadItem() |
Чтение элемента |
ReplaceItem() & ReplaceItemStream() |
Обновление существующего элемента или потока |
UpsertItem() & UpsertItemStream() |
Создание или обновление существующего элемента или потока на основе уникального идентификатора элемента |
saddle = ("create", (
{"id": "0120", "name": "Worn Saddle", "categoryId": "accessories-used"},
))
handlebar = ("create", (
{"id": "012A", "name": "Rusty Handlebar", "categoryId": "accessories-used"},
))
Операции пакетной службы транзакций выглядят аналогично API-интерфейсам операций с сингулярными операциями и содержат кортежи (operation_type_string
, args_tuple
, batch_operation_kwargs_dictionary
), с необязательным словарем kwargs.
operation_type_string
— это строка, представляющая тип операции, например create, upsert, replace, read, patch или delete.
Чтобы выполнить пакет, используйте метод execute_item_batch
объекта контейнера. Первый аргумент — это список операций, выполняемых в пакете. В нашем примере у нас есть две операции для создания элементов в одном значении ключа секции.
# Partition key
partition_key = "accessories-used"
batch = [
saddle,
handlebar
]
try:
# Execute the batch
batch_response = container.execute_item_batch(batch, partition_key=partition_key)
# Check the response and print results
for result in batch_response:
print(result.get("resourceBody"))
except exceptions.CosmosHttpResponseError as e:
print(f"Failed to execute batch: {e.message}")
Пакет транзакций поддерживает операции с тем же ключом логического раздела. Операции с разными ключами логических разделов завершаются ошибкой. В следующем примере пакет транзакций завершается сбоем с плохим запросом из-за наличия другого логического ключа секции.
partition_key = "accessories-used"
batch = [
("create", ({"id": "0120", "name": "Worn Saddle", "categoryId": "accessories-used"},)),
("create", ({"id": "012C", "name": "Pristine Handlebar", "categoryId": "accessories-new"},))
]
batch_response = container.execute_item_batch(batch, partition_key=partition_key)
const saddle = { id: "0120", name: "Worn Saddle", categoryId: "accessories-used" };
const handlebar = { id: "012A", name: "Rusty Handlebar", categoryId: "accessories-used" };
Значение ключа раздела для обоих элементов одинаково: accessories-used.
const partitionKey = "accessories-used";
Пакет SDK JavaScript предоставляет перечисление BulkOperationType
для указания таких операций, как Create
. Создайте массив объектов, представляющих операции, выполняемые в пакете.
const { BulkOperationType } = require("@azure/cosmos");
const batch = [
{ operationType: BulkOperationType.Create, resourceBody: saddle },
{ operationType: BulkOperationType.Create, resourceBody: handlebar },
];
Используйте метод container.items.batch
для выполнения пакета.
const response = await container.items.batch(batch, partitionKey);
Если все операции выполнены успешно, ответ содержит сведения об фиксации транзакции. Но при сбое любой отдельной операции выполняется откат всей транзакции.
Пакет транзакций поддерживает операции с тем же ключом логического раздела. Операции с разными ключами логических разделов завершаются ошибкой. В следующем примере пакет транзакций завершается сбоем с плохим запросом из-за наличия другого логического ключа секции.
const saddle = { id: "0120", name: "Worn Saddle", categoryId: "accessories-used" };
const handlebar = { id: "012C", name: "Pristine Handlebar", categoryId: "accessories-new" };
const partitionKey = "accessories-used";
const batch = [
{ operationType: BulkOperationType.Create, resourceBody: saddle },
{ operationType: BulkOperationType.Create, resourceBody: handlebar },
];
const response = await container.items.batch(batch, partitionKey);