Share via


Azure Cosmos DB의 트랜잭션 일괄 처리 작업

적용 대상: NoSQL

트랜잭션 일괄 처리는 성공 또는 실패해야 하는 지점 작업 그룹과 컨테이너의 동일한 파티션 키를 함께 제공합니다. 작업이 정의되고 일괄 처리에 추가되며 일괄 처리가 실행됩니다. 트랜잭션 일괄 처리 작업 내에 설명된 순서대로 모든 작업이 성공적으로 수행되면 트랜잭션이 커밋됩니다. 그러나 어느 한 작업이라도 실패하면 전체 트랜잭션이 롤백됩니다.

Azure Cosmos DB에서 트랜잭션이란?

일반적인 데이터베이스의 트랜잭션은 하나의 논리적 작업 단위로 수행되는 작업 시퀀스로 정의할 수 있습니다. 각 트랜잭션은 ACID(원자성, 일관성, 격리, 내구성) 속성을 보장합니다.

  • 원자성은 트랜잭션 내부에서 수행된 모든 작업이 하나의 단위로 처리되어 모두 커밋되거나 커밋되지 않도록 합니다.
  • 일관성은 데이터가 트랜잭션 간에 항상 올바른 상태로 유지되도록 합니다.
  • 격리는 두 트랜잭션이 서로를 방해하지 않도록 합니다. 많은 상용 시스템은 애플리케이션 요구에 따라 사용할 수 있는 여러 격리 수준을 제공합니다.
  • 내구성은 데이터베이스에서 커밋된 변경 내용이 항상 유지되도록 합니다. Azure Cosmos DB는 동일한 논리 파티션 키 내의 작업에 대해 스냅샷 격리를 사용하는 완전한 ACID 규격 트랜잭션을 지원합니다.

트랜잭션 일괄 처리 작업 및 저장 프로시저

현재, Azure Cosmos DB는 작업에 대한 트랜잭션 범위도 제공하는 저장 프로시저를 지원합니다. 그러나 트랜잭션 일괄 처리 작업은 다음과 같은 이점을 제공합니다.

  • 언어 옵션 – 트랜잭션 일괄 처리는 이미 작업 중인 SDK 및 언어에서 지원되지만 저장 프로시저는 JavaScript로 작성해야 합니다.
  • 코드 버전 관리 - 애플리케이션 코드의 버전을 관리하고 CI/CD 파이프라인에 온보딩하는 것은 저장 프로시저의 업데이트를 오케스트레이션하고 적절한 시간에 롤오버를 수행하는 것보다 훨씬 자연스럽게 진행됩니다. 또한 변경 내용을 보다 쉽게 롤백할 수 있습니다.
  • 성능 - 저장 프로시저 실행과 비교할 때 해당 작업에 대한 대기 시간이 최대 30% 줄어듭니다.
  • 콘텐츠 serialization – 트랜잭션 일괄 처리 내의 각 작업은 해당 페이로드에 대한 사용자 지정 serialization 옵션을 사용할 수 있습니다.

트랜잭션 일괄 처리 작업을 만드는 방법

트랜잭션 일괄 처리 작업을 만들 때 컨테이너 인스턴스로 시작하고 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;
}

Important

오류가 발생하는 경우 실패한 작업에 해당 오류에 대한 상태 코드가 포함됩니다. 다른 모든 작업에는 424 상태 코드(실패한 종속성)가 포함됩니다. 이미 존재하는 항목을 만들려고 하여 작업이 실패하면 상태 코드 409(충돌)가 반환됩니다. 이 상태 코드를 사용하여 트랜잭션 오류의 원인을 식별할 수 있습니다.