CHAPTER 11: ダーティリード と チェックサム


11.1 はじめに

Empressは、 潜在的に汚れた状態のデータを提供し、 ロックに関係なくEmpressデータベースから データを読む込むことを許可する ダーティリード機能を提供します。 (「潜在的に汚れた状態のデータ」とは例えば 別のトランザクションにより更新されているが、 まだコミットされていないデータなどを指します。)

Empressダーティリード機能は 通常のEmpressの操作のためのロック機構を 任意の方法または手段での変更はしません。 ダーティリードが指定されなければ、通常のロックのまま適用されます。 (ロック機構自体を変更するわけではないということです。) ダーティリードは、知りたがりで忙しいユーザーのために リードロック箇所をバイパスすることを 可能するためのオプションを付加するだけです。 また、ダーティリードは特権を無視しません。

ダーティリードは Empressデータベースから読み込まれたデータの確認と 検証するためにチェックサムを 使うことができ、データがこれらの確認テストに失敗した場合、 適切な動作を行います。 これはチェックサムの切り替えをするための ALTER TABLE コマンドと チェックサムの結果により、ダーティリードの行動を制御するための MSVALIDATELEVEL変数によって管理されます。

チェックサムがデータ確認のために設定された場合、 レコードのチェックサムは、それが挿入される際に合わせて 計算され、登録されます。 また、レコードの更新時においても行われます。

Empressがチェックサムでの問題を検出した場合、

チェックサムに問題がある場合おいて、 それが参照できるできないにかかわらず、 データを参照するためのオプションを提供します。

ダーティリードとチェックサムの特徴は互いに補足し合いますが、、 それらは独立して機能することができます。



11.2 ダーティリード・ユーザー仕様

ダーティリードはすべてのEmpressデータベースインターフェースで有効です。



11.3 チェックサム・ユーザー仕様

チェックサムはALTER TABLEコマンドによって設定されます。 (Empress SQL リファレンス マニュアルの ALTER TABLE を参照してください。)

テーブルのチェックサムが有効であれば、 DISPLAY ALLコマンドを使い、参照することができます。 例えば

   DISPLAY loans ALL;

は、以下のような出力を生成します。


   *** Table: loans ***

   Attributes:
     number                integer
     name                  character(25,1)
     date                  date(1)
     amount                dollar(6,1)
   
   System Attributes:
    EMPRESS_CHECK_SUM                 longinteger

   Creator: joe
   Lock Level: RECORD
   Property: varchecksum

   Table Type:  normal

   Table #: 19
   Records: 12
   Record size: 40

システムアトリビュート EMPRESS_CHECK_SUM は、 テーブルがチェックサムのレコードを持っていることを示します。

プロパティvarchecksumは、 テーブルが可変のチェックサムを持っていることを示します。



11.4 ダーティリード・システム変数

ダーティリードに関する3つのシステム変数があります。 これらの変数は、$EMPRESSPATH/config/initfileファイル中にあり、 他のすべてのEmpress変数と同じように コマンドラインからユーザー変数内へ、また $EMPRESSPATH/config/initfileファイル内に、 あるいは対話型 SQLセッション内で 設定することができます。 以下はこれらのシステム変数の説明です。

表 11-1: ダーティリード・システム変数

変数 説明
MSVALIDATELEVEL この変数は メインテーブルファイル(つまり .relファイル)および オーバーフローファイル(つまり .dtfファイル)を 読む込む場合とボーダーレコードを読み込む場合の ダーティリードの動作を制御します。 (「ボーダーレコード」は後に説明します。)
MSVALIDATERETRY この変数は、Empressが無効なレコードを読み込む際のリトライ数を指定します。 すべてのリトライが終了した後にまだ不正である場合、 不正なレコードをユーザーに届けるかまたは捨てるかは MSVALIDATELEVEL変数の設定によります。
MSVALIDATESLEEP この変数は、Empressが不正なレコードを読むための リトライ間のスリープのインターバル秒数を指定します。


11.4.1 MSVALIDATELEVEL

MSVALIDATELEVELの値は XYZの形式の3つの数字になり、 それぞれの数字は以下のケースでのダーティリードの動作を定義します。 (デフォルトは440です。)

ダーティリードの特別なケースとしてボーダーレコードがあります。 ボーダーレコード は、ディスクブロックの境界をまたがった メインテーブルファイル(つまり.relファイル)のレコードです。 例えば、ディスクブロックサイズが1024バイトの場合、 メインレコードのサイズが正確に1024バイトか 512 バイトおよび 256 バイトなどのような 1024バイトの約数である場合はボーダーレコードではなく、 これ以外のすべてはボーダーレコードになります。 システムは、他の隣接したブロック(レコードの残りを含むブロック)から 分かれた1ブロック(レコード部分が含まれた)をフラッシュすることができ、 そのため、ロックは設定されません。 ダーティリードは、この状況を避けるためにボーダーレコードを ロックするためのオプションを提供します。 ボーダーレコードのロックはチェックサムの確認がない時に特に有用です。

数字Xの値とこれらの説明を以下に示します。

0 無効なレコードは放棄し、ダーティリードの検索でのみチェックサムデータの 確認を使います。
1 無効なレコードを放棄せず、ダーティリードの検索でのみチェックサムデータの 確認を使います。
2 無効なレコードは放棄し、 ダーティリードの検索および通常の検索 でチェックサムデータの確認を使います。
3 無効なレコードを放棄せず、 ダーティリードの検索および通常の検索 でチェックサムデータの確認を使います。
4 無効なレコードを放棄せず、 ダーティリードの検索および通常の検索で チェックサムデータの確認を使いません。

数字Yの値とこれらの説明を以下に示します。

0 無効な可変長データを放棄し、 ダーティリードの検索でのみチェックサムデータの 確認を使います。 無効なTEXTアトリビュートには、すべて空白の文字列と 無効なBULKアトリビュートにはすべてゼロのデータが 格納されています。
1 無効な可変長データを放棄せず、 ダーティリードの検索でのみチェックサムデータの 確認を使います。
2 無効な可変長データを放棄し、 ダーティリードの検索および通常の検索でチェックサムデータの 確認を使います。 無効なTEXTアトリビュートにはすべて空白の文字列と 無効なBULKアトリビュートにはすべてゼロのデータが 格納されています。
3 無効な可変長データを放棄せず、 ダーティリードの検索および通常の検索でチェックサムデータの 確認を使います。
4 無効な可変長データを放棄せず、 ダーティリードの検索および通常の検索でチェックサムデータの 確認を使いません。

数字Zの値とこれらの説明を以下に示します。

0 0がセットされたとき、すべてのボーダーレコードは SELECT BYPASS_LOCKが実行されている間、ロックされません。
1 1がセットされたとき、 SELECT BYPASS_LOCKが実行されている間、 すべてのボーダーレコードにリードロックが設定されます。

11.4.2 MSVALIDATERETRY

MSVALIDATERETRYは、Empressが無効なレコードを読む際の リトライ数を指定します。 すべてのリトライが終了した後にまだ不正である場合、 不正なレコードをユーザーに届けるかまたは捨てるかは MSVALIDATELEVEL変数の設定によります。

MSVALIDATERETRY のデフォルト値は 10 です。 不正なレコードである場合、 レコードの確認テストでパスするかどうかチェックするために 10回までのリトライが行われるということ意味します。


11.4.3 MSVALIDATESLEEP

Empressが不正なレコードを読むための リトライ間のスリープのインターバル秒数を MSVALIDATESLEEPに指定します。

MSVALIDATESLEEPのデフォルト値は 0.09 です。 Empressが、リトライの間 9 ミリ秒スリープすることを意味します。



11.5 ダーティリード特権

ダーティリードは、データベース特権として新たな特権タイプを追加しています。 BYPASS_LOCKと呼ばれる特権でユーザー特権グループの1つになります。 BYPASS_LOCK特権は、テーブルへのSELECT BYPASS_LOCKを ユーザーに許可します。 この機能は許可されていないユーザーがロックされたレコードを読むことを防ぎます。 この特権をもつことにより、トランザクションにおいて 他のユーザによりロックされている中間のレコードを読むこと において大変役に立ちます。



11.6 エラーコードとエラーメッセージ

ダーティリードとチェックサムの 2つの新しいエラーコードとメッセージを紹介します。

  1. "不正なレコードが返されました。" 不正なレコードが検索されたときにエラーが起こります。

  2. "不正な可変長の値が返されました。" 不正な可変長の値が検索された場合にエラーが起こります。

    注意:マニュアル中の日本語のエラーメッセージですが、意味自体は同じですが、 実際のメッセージと多少、表現が異なるメッセージを返すことがありますのでご注意ください。 例えば、マニュアル中では、"不正なレコードが返されました。"と示しましたが、 "不正なレコードが取り出されました。"と返される場合もあります。