Udostępnij za pośrednictwem


Transakcyjne operacje grupowe w usłudze Azure Cosmos DB

DOTYCZY: NoSQL

Partia transakcyjna opisuje grupę operacji punktowych, które muszą zakończyć się powodzeniem lub niepowodzeniem z takim samym kluczem partycji w obrębie kontenera. Operacje są definiowane, dodawane do partii, a partia jest wykonywana. Jeśli wszystkie operacje kończą się powodzeniem w kolejności, w której zostały opisane w transakcyjnej operacji wsadowej, transakcja zostanie zatwierdzona. Jeśli jednak jakakolwiek operacja zakończy się niepowodzeniem, cała transakcja zostanie wycofana.

Co to jest transakcja w usłudze Azure Cosmos DB

Transakcja w typowej bazie danych może być zdefiniowana jako sekwencja operacji wykonywanych jako pojedyncza jednostka logiczna pracy. Każda transakcja zapewnia gwarancje właściwości ACID (niepodzielność, spójność, izolacja, trwałość).

  • Niepodzielność gwarantuje, że wszystkie operacje wykonywane wewnątrz transakcji są traktowane jako pojedyncza jednostka i albo wszystkie są zatwierdzone, albo żadna nie jest.
  • Spójność zapewnia, że dane są zawsze w prawidłowym stanie między transakcjami.
  • Izolacja gwarantuje, że żadne dwie transakcje nie zakłócają siebie — wiele systemów komercyjnych zapewnia wiele poziomów izolacji, które mogą być używane na podstawie potrzeb aplikacji.
  • Trwałość gwarantuje, że każda zmiana zatwierdzona w bazie danych zawsze będzie obecna. Usługa Azure Cosmos DB obsługuje pełne transakcje zgodne ze standardem ACID z izolacją migawkową dla operacji w ramach tego samego klucza partycji logicznej.

Operacje wsadowe oraz procedury utrwalone w transakcjach

Usługa Azure Cosmos DB obecnie obsługuje procedury składowane, które zapewniają również zakres transakcyjny operacji. Jednak transakcyjne operacje wsadowe oferują następujące korzyści:

  • Opcja językowa — transakcyjna partia jest obsługiwana w SDK i języku, z którego korzystasz, podczas gdy procedury składowane muszą być napisane w języku JavaScript.
  • Wersjonowanie kodu — wersjonowanie kodu aplikacji i wdrażanie go do potoku CI/CD jest znacznie bardziej naturalne niż organizowanie aktualizacji procedury składowanej i upewnienie się, że przełączenie odbywa się we właściwym czasie. Ułatwia również wycofywanie zmian.
  • Wydajność — mniejsze opóźnienie operacji równoważnych o maksymalnie 30% w porównaniu z wykonaniem procedury składowanej.
  • Serializacja zawartości — każda operacja w partii transakcyjnej może używać niestandardowych opcji serializacji dla danych.

Jak utworzyć operację transakcyjną zbiorczą

Podczas tworzenia transakcyjnej operacji wsadowej rozpocznij od instancji kontenera i wywołaj metodę CreateTransactionalBatch:

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

TransactionalBatch batch = container.CreateTransactionalBatch(partitionKey);

Następnie dodaj wiele operacji do partii:

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

Na koniec wywołaj metodę ExecuteAsync w partii:

using TransactionalBatchResponse response = await batch.ExecuteAsync();

Po odebraniu odpowiedzi sprawdź, czy odpowiedź zakończyła się pomyślnie. Jeśli odpowiedź wskazuje powodzenie, wyodrębnij wyniki:

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

Ważne

Jeśli wystąpi błąd, operacja, która zakończyła się niepowodzeniem, będzie mieć kod stanu odpowiadającego mu błędu. Wszystkie pozostałe operacje będą miały kod stanu 424 (niepowodzenie zależności). Jeśli operacja nie powiedzie się, ponieważ próbuje utworzyć element, który już istnieje, zostanie zwrócony kod stanu 409 (konflikt). Kod stanu umożliwia zidentyfikowanie przyczyny niepowodzenia transakcji.

Jak są wykonywane transakcyjne operacje wsadowe

Po wykonaniu transakcyjnej partii, wszystkie operacje w transakcyjnej partii są grupowane, serializowane w jeden pakiet danych i wysyłane jako pojedyncze żądanie do usługi Azure Cosmos DB.

Usługa odbiera żądanie i wykonuje wszystkie operacje w zakresie transakcyjnym i zwraca odpowiedź przy użyciu tego samego protokołu serializacji. Ta odpowiedź może być sukcesem lub porażką i dostarcza indywidualne odpowiedzi dla każdej operacji.

Zestaw SDK uwidacznia odpowiedź, aby zweryfikować wynik i opcjonalnie wyodrębnić każdy z wyników operacji wewnętrznych.

Ograniczenia

Obecnie istnieją dwa znane limity:

  • Limit rozmiaru żądania usługi Azure Cosmos DB ogranicza rozmiar ładunku usługi Batch transakcyjnego, który nie przekracza 2 MB, a maksymalny czas wykonywania wynosi 5 sekund.
  • Obecnie istnieje limit 100 operacji na transakcyjny Batch, aby zapewnić, że wydajność jest zgodna z oczekiwaniami i odpowiada standardom SLA.

Następny krok