장기 실행 트랜잭션
장기 실행 트랜잭션은 BizTalk 오케스트레이션에서 일반적으로 사용되는 중요한 구문입니다. 사용자 지정 범위 기반 보정 및 사용자 지정 범위 기반 예외 처리 기능과 트랜잭션 중첩 기능을 제공하며, 이러한 모든 기능을 통해 보다 유연성 있게 강력한 트랜잭션 아키텍처를 디자인할 수 있습니다.
오랜 시간 동안 트랜잭션을 실행해야 하고 전체 ACID 속성이 필요하지 않은 경우(즉, 데이터를 다른 트랜잭션으로부터 격리할 필요가 없는 경우) 장기 실행 트랜잭션을 사용합니다. 장기 실행 트랜잭션은 종종 외부 메시지가 도착할 때까지 기다리느라 오랜 기간 동안 사용되지 않을 수 있습니다.
장기 실행 트랜잭션에는 일관성과 지속성이 있지만 원자성과 격리성은 없습니다. 장기 실행 트랜잭션 내의 데이터는 잠기지 않으므로 다른 프로세스나 응용 프로그램에서 수정할 수 있습니다. 오랜 기간 동안 잠금을 유지하는 것은 비실용적이므로 상태 업데이트에 대한 격리 속성은 유지되지 않습니다.
장기 실행 트랜잭션의 커밋은 원자성 트랜잭션의 커밋과 다릅니다. 결과와 관련해서 분산 조정의 암시적 가정은 없습니다. 장기 실행 트랜잭션은 단일 오케스트레이션 인스턴스에만 있습니다. 대신 장기 실행 트랜잭션은 내부의 마지막 문이 완료될 때 커밋된 것으로 간주됩니다. 트랜잭션이 중단될 경우 상태가 "자동" 롤백되지 않습니다. 예외 및 보정 핸들러를 통해 프로그래밍 방식으로 이 작업을 수행할 수 있습니다.
범위는 변수, 메시지 및 .NET 구성 요소를 선언하여 해당 상태를 정의할 수 있습니다. 장기 실행 트랜잭션은 해당 범위 및 이 범위를 포함하는 모든 범위의 상태 정보와 오케스트레이션 내에 전역적으로 정의된 모든 상태 정보에 액세스할 수 있습니다. 해당 범위를 포함하지 않는 범위의 상태 정보에는 액세스할 수 없습니다.
장기 실행 트랜잭션에는 원자성 트랜잭션이나 다른 장기 실행 트랜잭션이 포함될 수 있습니다. 여러 수준으로 장기 실행 트랜잭션을 중첩할 수 있습니다. 예를 들어 트랜잭션에 각각 원자성 트랜잭션을 포함하는 두 개의 다른 장기 실행 트랜잭션이 포함될 수 있습니다.
중첩은 전체 트랜잭션에서 하나 이상의 구성 요소가 원자성이고 전체 트랜잭션이 장기 실행이어야 하는 경우에 특히 유용합니다. 구매 주문서를 받아서 수행하는 예를 고려해 보십시오. 구매 주문서가 언제든지 도착할 수 있고 주문 수행의 다양한 단계를 완료하는 데 시간이 걸리지만 전체 프로세스를 하나의 트랜잭션으로 처리하려고 합니다. 이 경우 전체 트랜잭션은 분명히 장기 실행이어야 하지만 지불 승인 등의 개별 단계는 원자성이 되어야 할 수 있습니다.
참고
트랜잭션이 아닌 범위나 오케스트레이션 내에 트랜잭션 범위를 중첩시킬 수는 없습니다. 포함하는 범위나 오케스트레이션이 트랜잭션이 아닌 경우 상태를 관리하지 않습니다. 내부에 있는 모든 범위의 상태 관리를 제대로 처리하려면 트랜잭션이어야 합니다.
참고
동기화된 트랜잭션은 다른 트랜잭션이나 동기화된 범위를 포함할 수 없습니다.
장기 실행 트랜잭션은 커밋 후 트랜잭션 활동을 보정하기 위해 호출되는 보정 블록을 지정할 수 있습니다. 보정 블록은 가능한 경우 트랜잭션을 취소하거나 어떤 식으로든 트랜잭션의 영향을 줄이는 데 도움이 되는 알림 등의 다른 기능을 수행할 수 있습니다. 사용자가 보정 코드를 추가하지 않으면 런타임 엔진에서 기본적으로 장기 실행 및 원자성 내부 트랜잭션의 보정 블록을 모두 호출합니다. 호출 순서는 마지막으로 커밋된 트랜잭션에서 시작하고 처음 커밋된 트랜잭션에서 끝나는 역순서입니다.
참고
성공적으로 커밋된 트랜잭션에 대해서만 보정을 수행할 수 있습니다.
트랜잭션은 내부 오류(예: 컴퓨터 오류, 소프트웨어 오류) 및 외부 오류(예: 취소 메시지)를 복구할 수 있는 내결함성을 지원합니다. 장기 실행 트랜잭션 내의 부분 업데이트는 트랜잭션 오류가 발생할 경우 ACID 트랜잭션에서와 같이 자동으로 롤백되지 않습니다.
오류가 발생하면 장기 실행 트랜잭션에 대한 예외 코드 블록이 호출됩니다. 예외 코드 블록에는 트랜잭션을 실행하는 동안 발생할 수 있는 오류를 처리하기 위해 작성한 오류 핸들러 집합이 들어 있습니다. 오류를 처리할 때 메시지, 변수 및 개체의 마지막으로 알려진 상태를 사용할 수 있습니다.
일반적으로 예외 핸들러에서 예외가 발생한 시간의 오케스트레이션 상태를 평가하고 해당 상태를 기반으로 필요한 작업을 수행하며 모든 중첩된 트랜잭션의 보정을 호출하도록 합니다.
오류가 발생하면 장기 실행 트랜잭션의 실행이 중단되며 오류가 발생한 후 다시 시작할 수 없습니다.