ネストトランザクション

親タスクが子タスクを呼び出すと、次の動作が実行されます。

親トランザクション
モード

子トランザクション
モード

トランザクション動作

遅延/ネスト遅延

物理

子トランザクションによって物理トランザクションがオープンされます。更新は、親タスクに関係なくデータベースに送信されます。

遅延/ネスト遅延

遅延/親と同一/なし

子トランザクションは親トランザクション内で実行されます。子タスクのデータ操作(DM)ステートメントは、親タスクがコミットされた時に送信されます。

遅延/ネスト遅延

ネスト遅延

子タスクは新しい遅延トランザクションとして開きます。トランザクションは、親タスクに関係なくデータベースにコミットされます。

物理

物理/親と同一

子タスクは、各レコードかタスクの後で親とともにデータベースへの更新を行ないます。親タスクと子タスクは、同じトランザクションを共有します。

物理

遅延/ネスト遅延

実行エラーです。

なし

なし

データ変更は許可されません。

なし

遅延/ネスト遅延/親と同一

子タスクは新しい遅延トランザクションとして開きます。トランザクションは、親タスクに関係なくデータベースにコミットされます。

 

親が物理トランザクションを実際に開いていない場合は、遅延の子タスクか、ネスト遅延の子タスクを含めることができます。

あるタスクが、別のタスク用に定義された[イベント]ロジックユニットから開かれると、トランザクションのネスト関係は、開発モードの定義ではなく実行時トランザクションを基に決定されます。

例えば、次のように動作します。

  1. 遅延トランザクションとして定義されているタスクAが、物理トランザクションとして定義されているタスクBを開きました。

  2. タスクBは物理トランザクションとしてデータベースを更新し、イベントがトリガされます。このイベントのハンドラはタスクA内に定義されており、遅延トランザクションであるタスクCを呼び出します。

  3. 遅延トランザクションであるタスクCは、物理トランザクションであるタスクBの下では実行できないので、実行エラーが発生します。しかし、タスクCが「親と同じ」として定義されていたとすれば、物理トランザクションとして開くので実行エラーは発生しません。

トランザクションなしのタスクAが、遅延タスクBをコールした場合、タスクBをクローズしないで、別の遅延タスクCをコールすると、以下の実行エラーが発生します。

「1つのコンテキストでは、複数の遅延トランザクションをオープンすることができません。」