ロックとトランザクション: キャッシュ範囲の設定

Magicでは、いくつかキャッシュに関する設定があります。
ここでは、DBMS(Pervasive , Oracle等)やOS(Windows)のキャッシュではなく、Magic独自のキャッシュについて取り扱います。

リポジトリ単位で見ると、キャッシュの設定は、テーブルリポジトリとプログラムリポジトリにあります。

まずは、テーブルリポジトリから。

テーブル特性テーブル特性のキャッシュ範囲は、デフォルトで「D=位置とデータ」になります。
一度読み込んだレコードはクライアントのメモリにキャッシュする、という設定です。
位置だけをキャッシュしてデータはデータベースから再読み込みする、という設定も可能です。
(位置については、こちらで説明しています。)
ここでの設定が、プログラムのデフォルトに影響します。

キャッシュの影響で意図した動作にならない、という経験からか、これを「N=なし」に変更するケースも実際には結構あるようです。
「意図した動作にならない」というのは、Magicは設定された通り忠実に実行しているが開発者の予測とは異なる、という場合も多々あります。
しかし、バージョンやサービスパックによっても微妙に振る舞いが異なるような気もします。
そういう曖昧さをクリアする意味で、私も「N=なし」に変更する派です。

次に、プログラムリポジトリです。

タスク特性タスク毎にキャッシュの設定は2箇所あります。
タスク特性のキャッシュ範囲と、DBテーブルのキャッシュです。
勿論、それぞれに役割があり、影響範囲も違います。

タスク特性のキャッシュ範囲は、メインテーブルに対するキャッシュ設定です。
物理トランザクションであれば、「T=テーブル特性に依存」がデフォルトとなり、テーブルリポジトリでの設定を引き継ぎます。
従って、タスク作成後にテーブル特性のキャッシュ設定を変更すると、それに伴ってタスクでのキャッシュの有無が変更されることになります。
また、テーブル特性の設定を無視して、このタスク独自の設定(キャッシュを使う/使わない)を明示することも可能です。

DBテーブルDBテーブルのキャッシュは、リンクテーブルに対するキャッシュ設定です。
こちらは、「Yes」か「No」を指定します。
「Yes」は「位置とデータ」で、「No」は「なし(キャッシュを使わない)」という意味です。
デフォルトは、やはりテーブル特性によって決まります。
但し、途中でテーブル特性を変更しても、作成済みのタスクの設定値は変更されません。