다음을 통해 공유


원자성 트랜잭션을 사용하는 시나리오

다음 시나리오에서는 원자성 트랜잭션의 사용에 대해 설명합니다.

시나리오 1: COM+ ServicedComponent를 사용하는 원자성 트랜잭션

다음 오케스트레이션은 원자성 트랜잭션과 함께 RetryTransactionException 을 사용하는 방법을 보여 줍니다. 예외 핸들러는 원자성 범위에 직접 포함될 수 없지만 예외 핸들러를 가질 수 있는 비트랜잭션 범위가 원자성 범위에 포함될 수 있습니다. ServicedComponent는 동일한 DTC 트랜잭션에 참여하며 구성 요소에서 발생한 예외는 RetryTransactionException으로 catch되고 다시 throw됩니다. (원자성 scope 대해 Retry 속성이 True로 설정되어 있다고 가정합니다.

오케스트레이션이 일시 중단되고 RetryTransactionException 이 throw되지 않더라도 MessageAssignment 셰이프의 작업이 롤백되었을 것입니다. 그러나 이 패턴을 사용하면 재시도가 자동으로 발생하는 응용 프로그램에 복원력을 부여할 수 있습니다.

COM+ ServicedComponent를 사용하는 원자성 트랜잭션

COM+ ServicedComponent BTS_Trans_Orch_Fig5 있는 원자성 트랜잭션

시나리오 2: 원자성 트랜잭션과 함께 트랜잭션된 어댑터 사용

다음 오케스트레이션은 SQL 어댑터와 함께 원자성 트랜잭션을 사용하는 방법을 보여줍니다. 전체 오케스트레이션은 두 가지 논리적 작업인 새 고객 삽입 및 고객에 대한 주문 세부 정보 삽입에 대한 개별 원자성 트랜잭션으로 장기 실행으로 표시됩니다.

주문 삽입이 실패하면 고객 삽입이 롤백되어야 합니다. 이 샘플에서는 SQL 어댑터를 사용하여 데이터베이스 작업을 수행합니다. 앞에서 설명한 대로 원자성 트랜잭션에 연결된 범위는 메시지가 MessageBox 데이터베이스로 전송되면 완료됩니다. 이는 엔진이 Scope_InsertCustomer 및 Scope_InsertOrder 범위에서 성공적으로 메시지를 보낸 후 각 범위가 커밋한다는 것을 의미합니다. SQL 어댑터는 고객 또는 주문을 실제로 삽입하기 위한 새 트랜잭션을 만듭니다.

포트에는 메시지가 송신 포트를 통해 성공적으로 전송되었는지 확인하는 "배달 알림"이라는 속성이 있습니다. 배달 알림 속성이 "Transmitted"로 설정되면 송신 작업의 트랜잭션 커밋 지점 앞에 수신 등록이 배치됩니다. 그러나 원자성 범위의 경우에는 수신 등록이 바깥쪽 부모 범위에 배치됩니다.

InsertOrder SQL 트랜잭션이 실패하는 시나리오에서는 "Nack"이 전송되고 "Scope_InsertOrder"가 커밋합니다. 송신 포트에서 구성된 재시도 횟수만큼 재시도가 실패하면 DeliveryFailureException이 발생합니다. 이 예외는 기본 예외 핸들러에 의해 catch되고 이 핸들러는 기본 보정 프로세스를 실행합니다. 이에 따라 Scope_InsertCustomer 및 Scope_InsertOrder에 연결된 보정 핸들러가 호출되어 고객 정보 삽입에 대한 실행 취소 작업이 수행됩니다.

참고

두 범위를 장기 실행 범위에 중첩하고 장기 실행 범위에 대해 예외 핸들러에서 Compensate 셰이프를 호출하면(장기 실행 트랜잭션 대상) 위에 설명된 것과 동일한 동작이 실행됩니다. 원자성 트랜잭션은 중첩 트랜잭션을 허용하지 않으므로 전체 오케스트레이션을 원자성으로 표시할 수 없습니다.

원자성 트랜잭션이 포함된 트랜잭션 어댑터

원자성 트랜잭션이 BTS_Trans_Orch_Fig6 트랜잭션된 어댑터