오케스트레이션의 변수 범위
예외 핸들러 및 보정 블록을 비롯하여 오케스트레이션 내의 다양한 위치에 포함되어 있는 변수 및 오케스트레이션 매개 변수의 표시 유형과 상태를 이해하기 위해서는 몇 가지 중요한 사항을 고려해야 합니다.
오케스트레이션 매개 변수는 오케스트레이션의 보정 블록뿐만 아니라 본문 전체에서 볼 수 있습니다.
범위 수준 변수는 모든 예외 핸들러 및 보정 블록뿐만 아니라 범위 본문에서 볼 수 있습니다. 예외 핸들러 내에서 해당 변수는 지정된 핸들러에 대한 예외가 본문의 초기화 작업 이전에 발생했는지 아니면 이후에 발생했는지를 알 수 없으므로 초기화되지 않은 것으로 간주됩니다. 이러한 이유로, 범위에서 변수를 선언하고 본문에서 초기화하면 예외 핸들러에서 해당 변수를 읽을 수 없으며 컴파일러 오류가 발생합니다. 장기 실행 트랜잭션의 경우 이러한 문제를 해결할 수 있습니다. 다음 예에서는 succeeded() 연산자를 사용하여 적절한 런타임 동작을 보장하는 방법을 보여 줍니다.
참고
아래의 코드는 논리적 프로세스를 설명하는 의사 코드로 오케스트레이션 Expression 셰이프 내에서 사용할 수 없습니다.
scope longrunning transaction L { System.Int32 i; System.Int32 v; body { i = 3; scope longrunning transaction T { body { i = 5; } } } exceptions { catch { if(succeeded(T)) { v = i; // OK to read from it here — no compiler errors! } } } }
보정 블록 내에서 모든 변수는 범위의 본문이 커밋될 때의 값으로 간주됩니다. 범위의 보정 블록은 절대로 본문이 완료된 직후에 실행되지 않습니다. 즉, 항상 중간 코드가 있습니다. 이러한 중간 코드에 의해 외부 범위 변수가 업데이트된 후 보정 블록이 실행되면 보정 블록 내에 해당 업데이트 내용이 반영되지 않습니다. 대신, 변수는 일시적으로 해당 보정을 소유하는 범위가 커밋되었을 때의 값으로 돌아갑니다.
트랜잭션이 루프 내에 중첩되면 트랜잭션은 루프가 실행되는 횟수만큼 보정됩니다. 각 반복에 대한 보정 블록 내에서 외부 범위 변수는 트랜잭션 반복이 커밋되었을 때의 값으로 간주됩니다.
외부 범위 변수 또는 내부 범위의 보정 블록 내에 포함된 오케스트레이션 매개 변수를 업데이트하면 보정 블록이 완료된 후에도 업데이트 내용이 표시되지 않습니다. 즉, 외부 범위 변수 값을 직접 수정하는 데는 보정 블록을 사용할 수 없습니다.