트랜잭션 일괄 처리 작업을 만들 때 컨테이너 인스턴스로 시작하고 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(충돌)가 반환됩니다. 이 상태 코드를 사용하여 트랜잭션 오류의 원인을 식별할 수 있습니다.
트랜잭션 일괄 처리 작업을 만들 때 CosmosBatch.createCosmosBatch를 호출합니다.
PartitionKey partitionKey = new PartitionKey("road-bikes");
CosmosBatch batch = CosmosBatch.createCosmosBatch(partitionKey);
다음으로 일괄 처리에 여러 작업을 추가합니다.
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);
마지막으로 컨테이너 인스턴스를 사용하여 일괄 처리로 executeCosmosBatch를 호출합니다.
CosmosBatchResponse response = container.executeCosmosBatch(batch);
응답이 수신되면 응답이 성공적으로 수행되는지 검토합니다. 응답이 성공을 나타내는 경우 결과를 추출합니다.
if (response.isSuccessStatusCode())
{
List<CosmosBatchOperationResult> results = response.getResults();
}
중요
오류가 발생하는 경우 실패한 작업에 해당 오류에 대한 상태 코드가 포함됩니다. 다른 모든 작업에는 424 상태 코드(실패한 종속성)가 포함됩니다. 이미 존재하는 항목을 만들려고 하여 작업이 실패하면 상태 코드 409(충돌)가 반환됩니다. 이 상태 코드를 사용하여 트랜잭션 오류의 원인을 식별할 수 있습니다.
컨테이너 인스턴스를 가져오거나 만듭니다.
container = database.create_container_if_not_exists(id="batch_container",
partition_key=PartitionKey(path='/category'))
Python에서 트랜잭션 Batch 작업은 단일 작업 API와 매우 유사하며, (Operation_type_string, args_tuple, Batch_Operation_kwargs_dictionary)를 포함하는 튜플입니다. 다음은 일괄 처리 작업 기능을 시연하는 데 사용되는 샘플 항목입니다.
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://learn.microsoft.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"
}
일괄 처리에 추가할 작업을 준비합니다.
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")})
일괄 처리에 작업을 추가합니다.
batch_operations = [
create_item_operation,
read_item_operation,
delete_item_operation,
upsert_item_operation,
replace_item_operation,
replace_item_if_match_operation
]
마지막으로 일괄 처리를 실행합니다.
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]
일괄 처리에서 패치 작업 및 바꾸기_if_match_etag 작업 사용에 대한 참고 사항
일괄 처리 작업 kwargs 사전은 제한되어 있으며 총 3개의 서로 다른 키 값만 사용합니다. 일괄 처리 내에서 조건부 패치를 사용하려는 경우 패치 작업에는 filter_predicate 키를 사용할 수 있으며, 작업에 etag를 사용하려는 경우 if_match_etag/if_none_match_etag 키도 사용할 수 있습니다.
batch_operations = [
("replace", (item_id, item_body), {"if_match_etag": etag}),
("patch", (item_id, operations), {"filter_predicate": filter_predicate, "if_none_match_etag": etag}),
]
오류가 발생하는 경우 실패한 작업에 해당 오류에 대한 상태 코드가 포함됩니다. 다른 모든 작업에는 424 상태 코드(실패한 종속성)가 포함됩니다. 이미 존재하는 항목을 만들려고 하여 작업이 실패하면 상태 코드 409(충돌)가 반환됩니다. 이 상태 코드를 사용하여 트랜잭션 오류의 원인을 식별할 수 있습니다.
트랜잭션 Batch가 실행되면 트랜잭션 Batch의 모든 작업이 그룹화되고 단일 페이로드로 직렬화되며 단일 요청으로 Azure Cosmos DB 서비스에 전송됩니다.
이 서비스는 요청을 수신하고 트랜잭션 범위 내에서 모든 작업을 실행하며 동일한 serialization 프로토콜을 사용하여 응답을 반환합니다. 이 응답은 성공 또는 실패이며 작업당 개별 작업 응답을 제공합니다.
SDK는 결과를 확인하고 필요에 따라 각 내부 작업 결과를 추출하기 위한 응답을 제공합니다.
현재는 다음과 같은 두 가지 알려진 제한 사항이 있습니다.
- Azure Cosmos DB 요청 크기 제한은 트랜잭션 Batch 페이로드의 크기를 2MB를 초과하지 않도록 제한하고 최대 실행 시간은 5초입니다.
- 성능이 예상대로 SLA 내에 있는지 확인하기 위해 현재 트랜잭션 Batch당 작업 100개로 제한되어 있습니다.