BEGIN ... END ステートメントは、BEGIN 内で定義されたステートメントおよび END キーワードに、単一ステートメントの状況を与えます。
2 番目の Label を取れるのは、最初の Label がある場合だけです。Label が 2 つともある場合、それらの Label は同一でなければなりません。同じレベルの 2 つ以上のラベル付きステートメントが同じ Label を持つことは可能ですが、2 番目の Label の利点は部分的に否定されます。その利点とは、ラベルがあいまいさなしに正確に各 END をその BEGIN と一致させることです。ただし、Statements 内でネストされたラベル付きステートメントが同じ Label を持つことはできません。なぜなら、この場合 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 を指定すると、一度にメッセージ・フローの 1 つのインスタンス (つまり 1 つのスレッド) のみ、特定の BEGIN ATOMIC... END ステートメント (スキーマとラベルで識別される) のステートメントを実行できます。ラベルがない場合、長さゼロのラベルが指定されている場合と同様の動作になります。
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;
直接的にも間接的にも 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 をあるスレッドが定期的に更新し、別のスレッドが定期的に読み取ることを想定しています。ATOMIC を使用する必要はありません。なぜなら 2 番目の SET ステートメントは常に有効な値を読み取るからです。更新と読み取りが非常に近い時点で行われると、古い値か新しい値のどちらが読み取られるかは分かりませんが、必ずそのどちらかになります。結果がガーベッジになることはありません。
DECLARE Count SHARED INT; ... SET Count = Count + 1;この例では、複数のスレッドが定期的に SET ステートメントを実行していることを想定しています。この場合、ATOMIC を使用する必要が生じます。なぜなら、2 つのスレッドがほぼ同じ瞬間に Count を読み取り、同じ値を取得する可能性があるからです。両方のスレッドとも追加を実行し、両方とも同じ値を戻して保管します。したがって、最終結果は N+1 になり、N+2 にはなりません。
ブローカーはこのロックより高水準なロック (SET ステートメント全体をカバーするロックなど) を自動的に提供しません。なぜなら、この種のロックは "永久ループ" を起こしやすいからです。
BEGIN ... END ステートメントを、常に 1 回だけループするループ構成体と考えることができます。BEGIN ... END ステートメント内でネストされた ITERATE または LEAVE ステートメントの効果は予想どおりになります。制御は END の次のステートメントに転送されます。BEGIN ... END ステートメント内で ITERATE または LEAVE を使用することは、明確な結果が出ているかエラーが起きたために長々とした計算を中止する必要のある場合に有効です。