Tips

スタックにプッシュしたレコードは保存も更新もできない

日付2011/08/10
ID76373 (英語原文参照)
バージョンv12
プラットフォームMac/Win

4DのコマンドPUSH RECORDは, カレントレコードをレコードスタックにプッシュします。カレントレコードは, 言い方を変えるなれば, カレントレコードポインタが指しているレコードのことです。カレントレコードポインタは, FIRST RECORD, NEXT RECORD, LAST RECORDなどのコマンドが実行されると移動します。レコードスタックはLIFO(後入れ先だし)スタックであり, 同じテーブルからいくつものレコードをプッシュすることができます。

スタックにプッシュされるものは, 正確にいえば, カレントレコードの作業用コピー, つまりデータベースから読み取られた後, スタックにプッシュされる前に値が変えられたのであれば, その状態のコピーです。スタックにプッシュされたレコードは, 他のプロセスからすればロックされており, プッシュしたプロセスからすれば「凍結」された状態です。いずれにしても, PUSH RECORDコマンドスタックにプッシュされたレコードは, 保存も更新もできない状態にあります。

凍結された状態とは, そのレコードをスタックからポップするまで, そのレコードの作業用コピーは保持されることを意味します。そのレコード(のコピー)は, スタックにある限り, 保存も更新もできません。

スタックにプッシュされたレコードは, たとえそれをプッシュしたプロセスが実行したクエリでヒットしたとしても, ポップされるわけではありません。別の言い方をすれば, カレントレコードポインタがスタックにプッシュされたレコードを指すことはありません。むしろ, クエリなどでカレントレコードになるのは, スタックにプッシュされたレコード(のコピー)ではなく, 実際にデータベースに保存されているレコードの新しいコピーです。そのレコードをプッシュしたプロセスが実行したクエリなので, レコードはロックされていない状態であり, 自由に書き換えることができます。この場合, スタックにプッシュされたコピーは影響を受けません。事実上, 同一レコードの複数の異なるコピーが同一プロセス内で同時に存在することになります。