親タスクが子タスクを呼び出すと、次の動作が実行されます。
親トランザクション |
子トランザクション |
トランザクション動作 |
遅延/ネスト遅延 |
物理 |
子トランザクションによって物理トランザクションがオープンされます。更新は、親タスクに関係なくデータベースに送信されます。 |
遅延/ネスト遅延 |
遅延/親と同一/なし |
子トランザクションは親トランザクション内で実行されます。子タスクのデータ操作(DM)ステートメントは、親タスクがコミットされた時に送信されます。 |
遅延/ネスト遅延 |
ネスト遅延 |
子タスクは新しい遅延トランザクションとして開きます。トランザクションは、親タスクに関係なくデータベースにコミットされます。 |
物理 |
物理/親と同一 |
子タスクは、各レコードかタスクの後で親とともにデータベースへの更新を行ないます。親タスクと子タスクは、同じトランザクションを共有します。 |
物理 |
遅延/ネスト遅延 |
実行エラーです。 |
なし |
なし |
データ変更は許可されません。 |
なし |
遅延/ネスト遅延/親と同一 |
子タスクは新しい遅延トランザクションとして開きます。トランザクションは、親タスクに関係なくデータベースにコミットされます。 |
親が物理トランザクションを実際に開いていない場合は、遅延の子タスクか、ネスト遅延の子タスクを含めることができます。
あるタスクが、別のタスク用に定義された[イベント]ロジックユニットから開かれると、トランザクションのネスト関係は、開発モードの定義ではなく実行時トランザクションを基に決定されます。
例えば、次のように動作します。
遅延トランザクションとして定義されているタスクAが、物理トランザクションとして定義されているタスクBを開きました。
タスクBは物理トランザクションとしてデータベースを更新し、イベントがトリガされます。このイベントのハンドラはタスクA内に定義されており、遅延トランザクションであるタスクCを呼び出します。
遅延トランザクションであるタスクCは、物理トランザクションであるタスクBの下では実行できないので、実行エラーが発生します。しかし、タスクCが「親と同じ」として定義されていたとすれば、物理トランザクションとして開くので実行エラーは発生しません。
トランザクションなしのタスクAが、遅延タスクBをコールした場合、タスクBをクローズしないで、別の遅延タスクCをコールすると、以下の実行エラーが発生します。
「1つのコンテキストでは、複数の遅延トランザクションをオープンすることができません。」