범위
범위는 작업을 그룹화하기 위한 프레임워크이며 주로 트랜잭션 실행 및 예외 처리에 사용됩니다.
범위에는 하나 이상의 블록이 있습니다. 하나의 본문이 있고 필요에 따라 개수에 제한 없이 예외 처리 블록을 본문에 추가할 수 있습니다. 범위의 특성에 따라 보정 블록(옵션)도 있을 수 있습니다. 일부 범위는 전적으로 예외 처리에 사용되며 보정이 필요하지 않습니다. 다른 범위는 명시적으로 트랜잭션이며, 항상 기본 보정 핸들러와 이 핸들러에 대해 사용자가 만드는 선택적 보정 핸들러가 있습니다. 또한 트랜잭션 범위에는 기본 예외 핸들러와 이 핸들러에 대해 개수에 제한 없이 사용자가 만드는 추가 예외 핸들러가 있습니다.
동기화된 범위
범위의 동기화 여부를 지정할 수 있습니다. 범위를 동기화하면 이 범위 내에서 액세스하는 모든 공유 데이터가 오케스트레이션에 있는 하나 이상의 병렬 작업에 의해 기록되지 않으며 다른 작업이 해당 데이터를 읽는 동안에도 기록되지 않습니다.
원자성 트랜잭션 범위는 항상 동기화됩니다. 동기화된 범위 내의 모든 작업은 해당 예외 핸들러의 모든 작업과 마찬가지로 동기화된 것으로 간주됩니다. 트랜잭션 범위에 대한 보정 핸들러의 작업은 동기화되지 않습니다.
주의
신중하게 프로세스를 디자인하지 않으면 교착 상태 조건이 발생할 수 있습니다. 예를 들어 오케스트레이션 A에 있는 병렬의 두 개 분기가 하나는 보내고 다른 하나는 받기 위해 동일한 메시지에 액세스하므로 둘 다 동기화된 범위를 가져야 합니다. 두 번째 오케스트레이션은 메시지를 받아서 다시 보냅니다. 오케스트레이션 A의 송신 분기가 수신 분기보다 먼저 해당 잠금을 받을 수 있으며, 이 경우 교착 상태가 발생합니다.
범위 중첩
범위 셰이프를 다른 범위 셰이프 내에 중첩할 수 있습니다. 범위 중첩 규칙은 다음과 같습니다.
동기화된 범위의 예외 핸들러를 포함하여 트랜잭션 범위 및/또는 동기화된 범위는 동기화된 범위 내부에 중첩할 수 없습니다.
원자성 트랜잭션 범위의 내부에 다른 트랜잭션 범위를 중첩할 수 없습니다.
비트랜잭션 범위나 오케스트레이션 내부에 트랜잭션 범위를 중첩할 수 없습니다.
최대 21 수준의 깊이까지 범위를 중첩할 수 있습니다.
호출 오케스트레이션 셰이프는 범위 내에 포함될 수 있지만 호출된 오케스트레이션은 다른 중첩 트랜잭션과 동일하게 처리되고 동일한 규칙이 적용됩니다.
시작 오케스트레이션 셰이프는 범위 내에 포함할 수 있습니다. 시작된 오케스트레이션에는 중첩 제한이 적용되지 않습니다.
범위 변수
범위 수준에서 메시지 및 상관 관계 집합과 같은 변수를 선언할 수 있습니다. 그러나 오케스트레이션 변수와 동일한 이름을 범위 변수에 사용할 수는 없으며 이름을 숨길 수 없습니다.