Magic 新連載スタート から 1198 日経過
ログインには購読のお申込みと Google へのアカウント登録が必要です。
Google のアカウントは Gmail アドレスである必要はありません。現在、お使いの会社のメールアドレスや Yahoo! メール、Hotmail などのメールアドレスでもご使用になれます。
連載購読コーナーへのログイン手順のヘルプはこちらです。
Google サイトの日本語版は2008年10月22日にリリースされました。
Google サイトを利用してのサイトの構築は、お気軽にご用命ください。
ドメイン名の取得から DNS の設定、Web サイトのデザインまで、包括してお引き受けいたします。
楽観的ロックにおける「差分更新」と「位置と更新項目」の活用法をご存知ですか?
遅延トランザクションで楽観的ロックを使用する場合は、数値型の項目に対しては SQL の「差分更新」を適用するものとし、その他のデータ型に対しては、「更新レコードの識別」特性で「位置と更新項目」のオプションを使用するのが適切であると思われます。
これにより、レコードロックをさらに細分化した「カラムレベルのロック」が可能となり、正常にレコードを更新することができるようになります。
ただし、更新項目には「位置」として使用されているインデックス項目を含めないように注意する必要があります。
イベントテーブルの「強制終了」オプションに「R=レコード更新前」と「P=レコード更新後」があるのをご存知ですか?
いずれも、ユーザイベントが発動された時に、「レコード書込み」イベントが発生します。
ただし、「R=レコード更新前」はイベントロジックユニットから戻ったあとにレコード前処理から処理が再開されるのに対し、「P=レコード更新後」はイベントロジックユニットを実行する前にレコード前処理からの再読み込みを行います。
したがって、「R=レコード更新前」はイベントロジックユニット中から更新後のレコードを見ることができないのに対し、「P=レコード更新後」はイベントロジックユニックの中からでも更新後のレコードを参照することができます。これが一番大きな違いです。
SQL Server の「INTEGER IDENTITY」の機能をご存知ですか?
これを使用すると、データベーステーブルに重複不可のインデックスカラムを自動生成することができます。
ただし、生成される値はレコード書込み後にしか参照することができませんので、この値を登録モードのタスク中から参照したいような場合は、「レコード書込」イベントなどを発生させてから参照するようにします。
なお、生成されたユニークなデータは上書き更新することはできず、レコードを削除してもこの値は再発行されませんので、完全にユニークなカラムとして取り扱うことができます。
このモードを使用すれば、V10 で新規アプリケーションを作成する場合でも V9 互換モードとしてレコードメインの記述を行うことができます。
V10 の記述方式に慣れるまでは、この V9 互換モードでロジックを書いていくというのも一つの手かもしれません。
詳細は V10 連載のほうで解説してまいります。
デフォルトではローカル接続だけが ON になっていますが、このリモート接続を ON にすると、地球の裏側からでも Magic のデータソースとして認識することができます。
MetaFrame やターミナルサービスを導入することもなく、手軽に WAN を構築することができます。もちろん、Magic のアプリケーションの中からでもこのデータソースを参照することができます。
リッチクライアントを導入する予算が組めない場合でも、このリモート接続方式で充分に目的が叶えられるはずです。VPN や FTP と違って、かなりのパフォーマンスが得られます。
詳細は、V10 連載のほうで解説いたします。
遅延トランザクションで悲観的ロックを実現するには Magic ロックを使用します。これにより、分離レベル1の「コミット済み読み取り」のトランザクションを実現しながら、レコードレベルの排他制御を行うことができます。
ただし、Magic ロックはリッチクライアントでは使用できません。リッチクライアントでは「差分更新」と「位置と更新項目」を利用した楽観的ロックを使用します。
なお、「差分更新」および「位置と更新項目」の機能は SQL テーブルにおいてしか利用できませんので、Pervasive でリッチクライアントを立ち上げる場合は注意が必要です。
Pervasive ではレコードの更新が常に「レコード単位の上書き更新」となるのが常ですが、SQL においてはカラム単位の上書き更新が可能となっています。このため、レコード単位の排他を特に意識しなくとも、マルチユーザ環境において時系列順での上書き更新でレコードの整合性を取ることができます。
四則演算を伴う数値型のカラムについても、差分更新の機能を使用することにより、ロックにたよらずに時系列順での上書き更新が可能となります。これは特に、今後リッチクライアントのアプリケーションを構築するうえでも、重要な考察ポイントとなります。
メモリテーブルは、コンテキスト管理下のマルチユーザ環境ではコンテキスト ID ごとに個別管理を行うことができます。この機能を利用すれば、開発者はユーザごとにデータソース名(テーブル名)を変える必要がなく、開発者はマルチユーザを意識することなくタスクを作成することができます。
ちなみに、タスクの実行時に登録されたレコードはコンテキストの終了とともに自動的に消滅するので、アプリケーション終了後にそれらのデータを見ることはできません。ただし、開発モードからフォアグラウンドで実行されたアプリケーションは単一のコンテキスト内で展開されるので、メモリテーブルの中身を見ることができます。
バックグラウンドで実行された場合は、開発モードに戻ってもテーブルの中身を見ることはできません。