Progress-4gl:トランザクションスコープは外部プログラムの呼び出しにどのように適用されますか?
現在のプログラム外のプロシージャ/プログラムのトランザクションスコープを理解するのに助けが必要です。
プログラムA、プログラムB、プログラムCの3つのプログラムがあるとします。プログラムAの中に、do transaction
(強く型付けされていない)ブロックの中にいくつかの行がラップされているプロシージャがあります。そのdo transaction
ブロック内で、別のプログラムBを呼び出します。プログラムBから戻ると、元に戻す、残すコマンドがあります。同じトランザクションブロック内で、プログラムCを呼び出し、元に戻します。この呼び出しの後で終了します。
私の質問は、トランザクションブロック内で、プログラムBがエラーなしで実行されたが、プログラムcがエラーを返した場合、プログラムCの呼び出し後に元に戻す、プログラムB内で発生したトランザクションも元に戻すのでしょうか?
Procedure do_something:
some processing....
do transaction:
error-message = "".
{run programB.p}
if error-message <> "" then undo, leave.
some further processing...
error-message = "".
{run programC.p}
if error-message <> "" then undo, leave.
end. /* end of do transaction */
end procedure.
回答
はい。トランザクションブロックで発生していることはすべて元に戻されます。
はい。あなたが説明する例では、すべてがロールバックされます。
それ自体が「拡張」されるほどではありませんが、トランザクションには、有効にされた時点からコミットまたはロールバックされるまで、そのセッションで発生するすべてのものが含まれます。内部プロシージャ、外部プロシージャ、ユーザー定義関数、クラスのメソッド、トリガーコードなど。
「そのセッション内」は重要です。アプリサーバーでプロシージャを呼び出す場合、そのアクティビティは、独自のトランザクションコンテキストを持つ独自のプロセスであるため、含まれません。
アプリサーバーが関係していると、物事は厄介になります。元の呼び出し元には、呼び出されたアプリサーバーセッションで何をロールバックするかを知る(組み込みの)機能がありません。アプリサーバーの呼び出しでエラーが返され、問題が発生した場合に呼び出し元がロールバックする可能性がありますが、呼び出し元はそのエラーをトラップして無視することもできます。