Lorsque vous créez une opération transactionnelle par lot, commencez par une instance de conteneur et appelez CreateTransactionalBatch :
PartitionKey partitionKey = new PartitionKey("road-bikes");
TransactionalBatch batch = container.CreateTransactionalBatch(partitionKey);
Ensuite, ajoutez plusieurs opérations au lot :
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);
Enfin, appelez ExecuteAsync sur le lot :
using TransactionalBatchResponse response = await batch.ExecuteAsync();
Une fois la réponse reçue, examinez si la réponse est positive. Si la réponse indique une réussite, extrayez les résultats :
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
En cas d’échec, l’opération ayant échoué a un code d’état correspondant à l’erreur. Toutes les autres opérations ont un code d’état 424 (échec de la dépendance). Si l’opération échoue parce qu’elle tente de créer un élément déjà existant, un code d’état 409 (conflit) est retourné. Les codes d’état facilitent l’identification de la cause de l’échec de la transaction.
Lors de la création d’une opération transactionnelle par lot, appelez CosmosBatch.createCosmosBatch :
PartitionKey partitionKey = new PartitionKey("road-bikes");
CosmosBatch batch = CosmosBatch.createCosmosBatch(partitionKey);
Ensuite, ajoutez plusieurs opérations au lot :
Product bike = new Product();
bike.setId("68719520766");
bike.setCategory("road-bikes");
bike.setName("Chropen Road Bike");
batch.createItemOperation(bike);
Part part = new Part();
part.setId("68719519885");
part.setCategory("road-bikes");
part.setName("Tronosuros Tire");
part.setProductId(bike.getId());
batch.createItemOperation(part);
Enfin, utilisez une instance de conteneur pour appeler executeCosmosBatch avec le lot :
CosmosBatchResponse response = container.executeCosmosBatch(batch);
Une fois la réponse reçue, examinez si la réponse est positive. Si la réponse indique une réussite, extrayez les résultats :
if (response.isSuccessStatusCode())
{
List<CosmosBatchOperationResult> results = response.getResults();
}
Important
En cas d’échec, l’opération ayant échoué a un code d’état correspondant à l’erreur. Toutes les autres opérations ont un code d’état 424 (échec de la dépendance). Si l’opération échoue parce qu’elle tente de créer un élément déjà existant, un code d’état 409 (conflit) est retourné. Les codes d’état facilitent l’identification de la cause de l’échec de la transaction.
Obtenir ou créer une instance de conteneur :
container = database.create_container_if_not_exists(id="batch_container",
partition_key=PartitionKey(path='/category'))
Dans Python, les opérations de lot transactionnel ressemblent beaucoup aux API d’opérations singulières et sont des tuples contenant (operation_type_string, args_tuple, batch_operation_kwargs_dictionary). Vous trouverez ci-dessous des exemples d’éléments qui seront utilisés pour démontrer les fonctionnalités des opérations de lots :
create_demo_item = {
"id": "68719520766",
"category": "road-bikes",
"name": "Chropen Road Bike"
}
# for demo, assume that this item already exists in the container.
# the item id will be used for read operation in the batch
read_demo_item1 = {
"id": "68719519884",
"category": "road-bikes",
"name": "Tronosuros Tire",
"productId": "68719520766"
}
# for demo, assume that this item already exists in the container.
# the item id will be used for read operation in the batch
read_demo_item2 = {
"id": "68719519886",
"category": "road-bikes",
"name": "Tronosuros Tire",
"productId": "68719520766"
}
# for demo, assume that this item already exists in the container.
# the item id will be used for read operation in the batch
read_demo_item3 = {
"id": "68719519887",
"category": "road-bikes",
"name": "Tronosuros Tire",
"productId": "68719520766"
}
# for demo, we'll upsert the item with id 68719519885
upsert_demo_item = {
"id": "68719519885",
"category": "road-bikes",
"name": "Tronosuros Tire Upserted",
"productId": "68719520768"
}
# for replace demo, we'll replace the read_demo_item2 with this item
replace_demo_item = {
"id": "68719519886",
"category": "road-bikes",
"name": "Tronosuros Tire replaced",
"productId": "68719520769"
}
# for replace with etag match demo, we'll replace the read_demo_item3 with this item
# The use of etags and if-match/if-none-match options allows users to run conditional replace operations
# based on the etag value passed. When using if-match, the request will only succeed if the item's latest etag
# matches the passed in value. For more on optimistic concurrency control, see the link below:
# https://video2.skills-academy.com/azure/cosmos-db/nosql/database-transactions-optimistic-concurrency
replace_demo_item_if_match_operation = {
"id": "68719519887",
"category": "road-bikes",
"name": "Tronosuros Tireh",
"wasReplaced": "Replaced based on etag match"
"productId": "68719520769"
}
Préparez les opérations à ajouter au lot :
create_item_operation = ("create", (create_demo_item,), {})
read_item_operation = ("read", ("68719519884",), {})
delete_item_operation = ("delete", ("68719519885",), {})
upsert_item_operation = ("upsert", (upsert_demo_item,), {})
replace_item_operation = ("replace", ("68719519886", replace_demo_item), {})
replace_item_if_match_operation = ("replace",
("68719519887", replace_demo_item_if_match_operation),
{"if_match_etag": container.client_connection.last_response_headers.get("etag")})
Ajoutez les opérations au lot :
batch_operations = [
create_item_operation,
read_item_operation,
delete_item_operation,
upsert_item_operation,
replace_item_operation,
replace_item_if_match_operation
]
Enfin, exécutez le lot :
try:
# Run that list of operations
batch_results = container.execute_item_batch(batch_operations=batch_operations, partition_key="road_bikes")
# Batch results are returned as a list of item operation results - or raise a CosmosBatchOperationError if
# one of the operations failed within your batch request.
print("\nResults for the batch operations: {}\n".format(batch_results))
except exceptions.CosmosBatchOperationError as e:
error_operation_index = e.error_index
error_operation_response = e.operation_responses[error_operation_index]
error_operation = batch_operations[error_operation_index]
print("\nError operation: {}, error operation response: {}\n".format(error_operation, error_operation_response))
# [END handle_batch_error]
Remarque pour l’utilisation de l’opération patch et de l’opération replace_if_match_etag dans le lot
Le dictionnaire kwargs des opérations par lots est limité et ne prend que trois valeurs de clé différentes au total. Si vous souhaitez utiliser la mise à jour corrective conditionnelle dans le lot, l’utilisation de la clé filter_predicate est disponible pour l’opération patch, ou si vous souhaitez utiliser des etags avec l’une des opérations, l’utilisation des clés if_match_etag/if_none_match_etag est également disponible.
batch_operations = [
("replace", (item_id, item_body), {"if_match_etag": etag}),
("patch", (item_id, operations), {"filter_predicate": filter_predicate, "if_none_match_etag": etag}),
]
En cas d’échec, l’opération ayant échoué a un code d’état correspondant à l’erreur. Toutes les autres opérations ont un code d’état 424 (échec de la dépendance). Si l’opération échoue parce qu’elle tente de créer un élément déjà existant, un code d’état 409 (conflit) est retourné. Les codes d’état facilitent l’identification de la cause de l’échec de la transaction.
Procédure d’exécution des opérations de lot transactionnel
Lorsque le lot transactionnel est exécuté, toutes les opérations du lot transactionnel sont regroupées, sérialisées en une seule charge utile et envoyées en tant que requête unique au service Azure Cosmos DB.
Le service reçoit la demande et exécute toutes les opérations au sein d’une étendue transactionnelle et retourne une réponse en utilisant le même protocole de sérialisation. Cette réponse est une réussite ou un échec. Elle fournit les réponses aux opérations individuelles par opération.
Le SDK expose la réponse pour vous permettre de vérifier le résultat et, éventuellement, d’extraire chacun des résultats de l’opération interne.
Limites
Il existe actuellement deux limites connues :
- La limite de taille de la requête Azure Cosmos DB contraint la taille de la charge utile du lot transactionnel à ne pas dépasser 2 Mo. La durée d’exécution maximale est de 5 secondes.
- Il existe une limite actuelle de 100 opérations par lot transactionnel pour garantir que les performances sont telles que prévues et conformes aux SLA.
Étapes suivantes