BEGIN ... END문은 BEGIN 및 END 키워드 내에 정의된 명령문에 단일 명령문의 상태를 제공합니다.
첫 번째 Label이 있는 경우에만 두 번째 Label이 제공될 수 있습니다. 레이블이 모두 있는 경우에는 동일해야 합니다. 같은 레이블에서 둘 이상의 레이블된 명령문이 같은 레이블을 사용할 수 있지만, 이 경우 두 번째 레이블의 장점이 부분적으로 없어지게 됩니다. 장점은 레벨이 각 END를 각각의 BEGIN과 정확하게 일치시킨다는 것입니다. 그러나 명령문 내에서 중첩된 레이블이 있는 명령문이 동일한 레이블을 갖는 것은 ITERATE 및 LEAVE 문의 작동을 모호하게 만들기 때문입니다.
DECLARE Variable1 CHAR 'Existing variable'; -- A reference to Variable1 here returns 'Existing variable' BEGIN -- A reference to Variable1 here returns 'Existing variable' DECLARE Variable1 CHAR 'Local variable'; -- Perfectly legal even though the name is the same -- A reference to Variable1 here returns 'Local variable' END;
ATOMIC이 지정된 경우 메시지 플로우의 하나의 인스턴스(즉, 하나의 스레드)만 언제라도 특정 BEGIN ATOMIC... END 문의 명령문(스키마 및 레이블로 식별)을 실행할 수 있습니다. 레이블이 없는 경우 작동은 0 길이의 레이블이 지정된 것과 같습니다.
CREATE PROCEDURE WtiteSharedVariable1(IN NewValue CHARACTER) SharedVariableMutex1 : BEGIN ATOMIC -- Set new value into shared variable END; CREATE FUNCTION ReadSharedVariable1() RETURNS CHARACTER SharedVariableMutex1 : BEGIN ATOMIC DECLARE Value CHARACTER; -- Get value from shared variable RETURN Value; END;
"교착 상태(deadly embraces)"로 이어질 수 있기 때문에 직접적으로든 간접적으로든 BEGIN ATOMIC... END 문을 중첩하지 마십시오. 이러한 이유로 atomic 블록에서 PROPAGATE 문을 사용하지 마십시오.
둘 이상의 인스턴스로 전개되지 않는 플로우에서 BEGIN ATOMIC 구성을 사용할 필요가 없습니다(그러나 운에 맡기는 것은 좋지 않음). 또한 공유 변수에 대한 읽기 및 쓰기에서 BEGIN ATOMIC 구성을 사용할 필요가 없습니다. 브로커는 항상 안전하게 공유 변수에 새 값을 기록하고 공유 변수에서 마지막 값을 읽습니다. ATOMIC은 응용프로그램이 중간 결과를 참조하는 경우에만 필요합니다.
DECLARE LastOrderDate SHARED DATE; ... SET LastOrderDate = CURRENT_DATE; ... SET OutputRoot.XMLNSC.Data.Orders.Order[1].Date = LastOrderDate;여기서 하나의 스레드가 정기적으로 LastOrderDate를 갱신하고 다른 스레드가 정기적으로 읽는다고 가정합니다. 두 번째 SET 문이 항상 유효한 값을 읽기 때문에 ATOMIC을 사용할 필요가 없습니다. 갱신과 읽기가 시간상 매우 가깝게 발생하는 경우 기존 값 또는 새 값을 읽는지 여부는 확실하지 않지만, 항상 둘 중 하나입니다. 결과가 가비지가 되는 일은 발생하지 않습니다.
DECLARE Count SHARED INT; ... SET Count = Count + 1;여기서는 몇 개의 스레드가 정기적으로 SET 문을 실행한다고 가정합니다. 이 경우 두 개의 스레드가 거의 동일한 순간에 Count를 읽고 동일한 값을 가져올 수 있기 때문에 ATOMIC을 사용해야 합니다. 두 개의 스레드가 모두 덧셈을 수행하고 모두 동일한 값을 저장합니다. 최종 결과는 N+1이지 N+2가 아닙니다.
이러한 잠금이 "교착 상태(deadly embraces)"를 유발하기 쉽기 때문에 브로커에서는 자동으로 이보다 상위 레벨의 잠금을 제공하지 않습니다(예: 전체 SET문에 해당되는 잠금).
BEGIN ... END문을 항상 한 번만 루프되는 루프 구조체로 고려할 수 있습니다. BEGIN ... END 문 내에서 중첩된 ITERATE 또는 LEAVE 문의 효과는 예상한 것과 같습니다. 제어가 END 다음의 명령문으로 전달됩니다. BEGIN ... END문 내에서 ITERATE 또는 LEAVE의 사용은 정확한 결과를 얻었거나 오류가 발행했기 때문에 일련의 긴 계산을 중지해야 하는 경우에 유용합니다.