ロックとトランザクション: トランザクション開始が有効になる条件

タスク特性トランザクションを開始するには、タスク特性で、その設定をします。

しかし、メインテーブルもリンクテーブルも使わないタスクでトランザクション開始を設定して有効なのでしょうか?
基本的には無効です。
データベースとの関係を持たないタスクでトランザクション開始を設定しても、どこに向かってトランザクションを通知すればよいのか分からないので、その設定は無視されます。

宣言では、それでも(メインテーブル、リンクテーブルなしの状態)トランザクションを有効にしたいときは、どのようにすれば良いでしょうか?
データビューで「D=宣言」を使います。
これにより、データベースとの関係を持つことができるので、トランザクションの通知先が明示されることになります。

尚、データビューの「D=宣言」をPervasiveで使うとファイルオープンになります。
旧バージョンでも使われるバッチタスクでのファイル先行オープンです。
子タスク以下で使われるファイルを親タスクでオープンしておくことで、ファイルのオープン/クローズが頻発することを防ぎ、バッチを高速化する常套手段です。

さて、話が逸れましたが、データビューが全く白紙状態であっても、トランザクション開始が有効になるケースがあります。
それは、親タスク(上位のプログラム)でテーブルを使っている場合です(リードオンリーでも)。

親タスクでは、テーブルをリードオンリーで使うためトランザクションを設定せず、子タスクでトランザクション開始を設定した場合、その子タスクのデータビューが白紙状態であっても、トランザクションは開始されます。
これは、タスクコールだけでなく、プログラムコールでも同様のルールとなります。

要するに、トランザクション開始が有効になる条件とは、トランザクションを通知するデータベースが、現在のタスク以上のところで明示されていること、となります。
データベースの使い方は、メインテーブルでも、リンクテーブルでも、宣言でも構いません。

検証用のサンプルプログラムを作成してみました。
こちらから、どうぞ。

また、物理トランザクションでは、トランザクションのネストはできません。
トランザクション開始が有効になったタスクよりも下位のタスクでは、トランザクション開始の設定は無視されます(プログラムコールも同様)。