メインコンテンツへスキップ

memoryテーブルを保持したい

コメント

10件のコメント

  • nkmt

    いい質問投稿をしてくださいました。私も悩んでいる事の気付きになりました。

  • Tera

    意図的にMemoryテーブルの内容を保存したい場合はnkmt様のご回答がお役に立つと思います。

    Memoryテーブルはトランザクション保持しない前提で使用するものなので、予期せぬ強制終了等を想定される場合には別のデータベースを検討された方がよいと思われます。

  • Tanda

    mnさん、

    Teraさんが言われるように、トランザクション機能のないデータベースを使えば、中途半端な状態でもデータが保存されると思いますよ。

  • Tanda

    mnさん、

    補足です。

    ただし、データがキャッシュに残ったままの状態ですと、ディスクに保存されていないケースも考えられますね。キャッシュを使わないという設定にしたとしても、今度はインデックスとの不整合が生じる可能性もありますね。

  • Tera

    Tandaさん

    ディスクへの保存はMagicのトランザクション設定次第では?最小のレコード単位にでも設定しておけばmnさんの欲しい情報は確実に取得できるという認識でした。

    強制終了時のキャッシュの動きまでは知識不足なのですが、キャッシュのみ更新されて実テーブルは更新されない(あるいはその逆)というような事もあるのでしょうか?

  • Tanda

    Teraさん、

    SQL系列のデータベースは物理トランザクションが必須になっておりまして、デフォルトでこの機能が搭載されております。これは、仮にMagicで遅延トランザクションを指定していたとしても、必ず通過するトランザクションです(二重構造のトランザクションになります)。

    したがって、トランザクションがコミットされたものはデータベースに保存されますが、コミットされていないものは自動的にロールバックされます。

    Magicのタスクは「トランザクション開始」のレベルがデフォルトで「P=レコード前の前」になっておりまして、PCがフリーズしたような状態ですと、レコードレベルを通過してコミットされたものはデータベースに保存されていますが、トランザクション中のレコードはロールバックされます。

    また、トランザクション開始レベルを「T=タスク前の前」にしてあるものは、処理されたレコードのすべてがトランザクション中の状態になりますので、異常終了時には対象レコードのすべてがロールバックされます。

    もうひとつのご質問ですが、SQL以前のISAM系のデータベースですと、デフォルトでキャッシュがオンになっているものが多いと思います。その場合、PCフリーズとか、停電とかの不慮の事故が起きた場合は、メモリ上のキャッシュは消えてなくなりますね。

  • 水野雅仁

    弊社でも無理矢理やっているところですが、memoryに書込するときに同時にlocalにmemoryと同じテーブルを構築して書いてますね。

    少なくとも、memoryのレコード後が通っているものまでに関しては、救ってます。

    正常に登録が完了したら、localも初期化してます。

  • Tanda

    水野さん、

    そういえば、memory は元々コンテキスト単位ですから、最初からlocalでもいけそうですね...

     

  • Tanda

    ちなみに、Localを使用する場合は、全クライアントが絶対パスを使用して、必ず自分のPCのフォルダを見に行くように指定してやる必要がありますね。

    全クライアントがサーバからMagic本体を起動しているような環境ですと、デフォルトの相対パスの指定(カレントのlocal.sqlite)のままでは、全員が同じデータベースファイルを見に行ってしまいますから、データベースの共有になってしまいます。要注意ですね。

  • Tanda

    失礼!元の質問がRIAアプリでしたね!

    RIAならパスを心配する必要はないです!!
    自動的にローカルの %TEMP% の配下にファイルが作成されますね。

サインインしてコメントを残してください。