Создание пакета транзакций с помощью пакета 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);