memoryテーブルを保持したい
RIAのアプリで、アプリを強制終了したときに、memoryテーブルの内容を保持したままで、再度アプリ起動したときにmemoryテーブルの情報を再度取得するようなことは可能でしょうか?
-
いい質問投稿をしてくださいました。私も悩んでいる事の気付きになりました。

-
意図的にMemoryテーブルの内容を保存したい場合はnkmt様のご回答がお役に立つと思います。
Memoryテーブルはトランザクション保持しない前提で使用するものなので、予期せぬ強制終了等を想定される場合には別のデータベースを検討された方がよいと思われます。
-
mnさん、
Teraさんが言われるように、トランザクション機能のないデータベースを使えば、中途半端な状態でもデータが保存されると思いますよ。
-
mnさん、
補足です。
ただし、データがキャッシュに残ったままの状態ですと、ディスクに保存されていないケースも考えられますね。キャッシュを使わないという設定にしたとしても、今度はインデックスとの不整合が生じる可能性もありますね。
-
Teraさん、
SQL系列のデータベースは物理トランザクションが必須になっておりまして、デフォルトでこの機能が搭載されております。これは、仮にMagicで遅延トランザクションを指定していたとしても、必ず通過するトランザクションです(二重構造のトランザクションになります)。
したがって、トランザクションがコミットされたものはデータベースに保存されますが、コミットされていないものは自動的にロールバックされます。
Magicのタスクは「トランザクション開始」のレベルがデフォルトで「P=レコード前の前」になっておりまして、PCがフリーズしたような状態ですと、レコードレベルを通過してコミットされたものはデータベースに保存されていますが、トランザクション中のレコードはロールバックされます。
また、トランザクション開始レベルを「T=タスク前の前」にしてあるものは、処理されたレコードのすべてがトランザクション中の状態になりますので、異常終了時には対象レコードのすべてがロールバックされます。
もうひとつのご質問ですが、SQL以前のISAM系のデータベースですと、デフォルトでキャッシュがオンになっているものが多いと思います。その場合、PCフリーズとか、停電とかの不慮の事故が起きた場合は、メモリ上のキャッシュは消えてなくなりますね。
-
弊社でも無理矢理やっているところですが、memoryに書込するときに同時にlocalにmemoryと同じテーブルを構築して書いてますね。
少なくとも、memoryのレコード後が通っているものまでに関しては、救ってます。
正常に登録が完了したら、localも初期化してます。
-
水野さん、
そういえば、memory は元々コンテキスト単位ですから、最初からlocalでもいけそうですね...
-
ちなみに、Localを使用する場合は、全クライアントが絶対パスを使用して、必ず自分のPCのフォルダを見に行くように指定してやる必要がありますね。
全クライアントがサーバからMagic本体を起動しているような環境ですと、デフォルトの相対パスの指定(カレントのlocal.sqlite)のままでは、全員が同じデータベースファイルを見に行ってしまいますから、データベースの共有になってしまいます。要注意ですね。
-
失礼!元の質問がRIAアプリでしたね!
RIAならパスを心配する必要はないです!!
自動的にローカルの %TEMP% の配下にファイルが作成されますね。
サインインしてコメントを残してください。
コメント
10件のコメント