|
以下の機能は、マルチユーザー環境でファイルの整合性を保証しながら、並行アクセスをサポートします。
アプリケーションは、明示的に、一度に 1 レコード(単一レコード ロック)または一度に複数のレコード(複数レコード ロック)をロックできます。アプリケーションは、レコード ロックを指定する場合、ウェイトまたはノーウェイト条件を適用することもできます。アプリケーションが現在使用できないレコードに対するノーウェイト ロックを要求する場合、つまり、レコードが既に別のアプリケーションでロックされているか、ファイル全体が排他トランザクションでロックされている場合、トランザクショナル インターフェイスはロックを許可しません。
アプリケーションが使用できないレコードに対するウェイト ロックを要求すると、トランザクショナル インターフェイスはデッドロック状態の有無を確認します。デッドロック検出ステータス コードを返す前に待機するようにトランザクショナル インターフェイス を設定することができます。これを行うと、トランザクショナル インターフェイスを内部的に待機させてアプリケーションにはオペレーションを再試行させないので、マルチユーザー環境におけるパフォーマンスを向上させます。
ファイルに対して行う変更が多く、また、これらの変更をすべて行うか、またはまったく行わないかを確実にしなければならない場合は、トランザクションでこれらの変更を行うためのオペレーションを取り込みます。明示的なトランザクションを定義すれば、トランザクショナル インターフェイスに複数のオペレーションをアトミックな単位として処理させることができます。ほかのユーザーは、トランザクションが終了するまでファイルに対して行われた変更がわかりません。トランザクショナル インターフェイスは、排他トランザクションと並行トランザクションの 2 種類のトランザクションをサポートします。
排他トランザクションでは、データ ファイルでレコードを挿入、更新または削除するときにトランザクショナル インターフェイスがそのデータ ファイル全体をロックします。ほかのアプリケーションまたは同じアプリケーションの別のインスタンスはファイルを開いてそのレコードを読み取ることができますが、ファイルを変更することはできません。ファイルは、アプリケーションがトランザクションを終了または中止するまで、ロック状態のままになります。
並行トランザクションでは、トランザクショナル インターフェイスは、実行するオペレーションによってファイル内のレコードまたはページをロックします。トランザクショナル インターフェイスは、複数のアプリケーション(または同じアプリケーションの複数のインスタンス)が同じファイルの異なる部分に並行トランザクション内で変更を行えるようにしますが、それはこれらの変更が既にロックされているほかのファイル部分に影響を与えない場合に限られます。レコードまたはページは、アプリケーションがトランザクションを終了または中断するまで、ロック状態のままになります。並行トランザクションは、6.0 以降のファイルのみに使用できます。
たとえ要求されたレコードを並行トランザクションが既にロックしていても、クライアントはこれまでどおりレコードを読み取ることができます。ただし、これらのクライアントは排他トランザクション内から処理を行えません。また、要求されたレコードを含むファイルが排他トランザクションで現在ロックされているか、要求されたレコードを並行トランザクションが既にロックしている場合、クライアントは読み取り操作にロック バイアスを適用できません。
クライアントが排他ロックでレコードを読み取ると、トランザクショナル インターフェイスは個々のレコードだけをロックし、レコードが存在するページの残りの部分はロックされない状態のままになります。
メモ
トランザクション内からファイルを開くだけでは、レコード、ページまたはファイルはロックされません。また、トランザクショナル インターフェイスは、読み取り専用のフラグを立てたファイルや読み取り専用モードで開いたファイルはロックしません。
排他トランザクションを使用する場合、Begin Transaction(19 または 1019)オペレーションにノー ウェイト バイアスが付加されない限り、トランザクショナル データベース エンジンはロックされたファイルでほかのクライアントを暗黙に待機させます。アプリケーションは、この暗黙の待機状態でハングしたように見えます。これらの排他トランザクションの寿命が短いと、待機時間に気が付かない場合があります。ただし、暗黙の待機を必要とする多くのクライアントの影響によって、大量の CPU 時間が使用されます。さらに、同じファイル内の複数のポジション ブロックはロックを共有します。
暗黙の待機を必要とする排他トランザクションも、ネットワーク帯域幅を無駄に使用しています。トランザクショナル データベース エンジンは、リクエスターに戻る前に約 1 秒間待機します。リクエスターは待機状態を認識し、トランザクショナル データベース エンジンに操作を返します。したがって、排他トランザクションは余計なネットワーク トラフィックを発生させる可能性もあります。
余計な CPU サイクルとネットワーク トラフィックの量は、ロック済みファイルで待機しているクライアント数と排他トランザクションで必要な時間と相まって、幾何級数的に増加します。
すべてのオペレーションを 1 つのトランザクション ログに記録することによって、トランザクション一貫性保守とアトミシティを保証するようにトランザクショナル インターフェイスを設定できます。トランザクション一貫性保守は、クライアントが End Transaction オペレーションを発行したときと、トランザクショナル データベース エンジンが正常終了したステータス コードをクライアントに返す前に、トランザクショナル データベース エンジンがログへの書き込みを終了することを保証する機能です。アトミシティは、特定のステートメントが終わりまで実行しない場合にそのステートメントがデータベース内に部分的または不明確な影響を残さないように保証し、それによってデータベースを安定した状態に保つことでデータベースの整合性を保証します。
トランザクション一貫性保守のオーバーヘッドなしでアトミシティが必要な場合は、Pervasive PSQL V8 以降のリリースのトランザクション ログ機能を使用することができます。トランザクション ログの詳細については、『Advanced Operations Guide』を参照してください。
デフォルトでは、トランザクション ログはデフォルトの Windows システム ディレクトリの ¥MKDE¥LOG サブディレクトリにあります。ログは、トランザクショナル データベース エンジンと同じマシン上に存在しなければなりません。トランザクション ログ ディレクトリ設定オプションを使用して、ロケーションを変更できます。
トランザクショナル データベース エンジンは、ログ セグメントと呼ぶ 1 つまたは複数の物理ファイルでトランザクション ログを保守します。現在のログ セグメントがユーザー定義のサイズ上限に達し、変更が待機状態であるファイルがなく、トランザクショナル データベース エンジンがシステム トランザクションを終了すると、トランザクショナル インターフェイスは新しいログ セグメントを開始します。
ログ セグメントには必ず .LOG というファイル拡張子が付きます。トランザクショナル データベース エンジンはログ セグメントのファイル名として、00000001.LOG、00000002.LOG、.... のように、8 桁の 16 進数を使った連続する番号を使用します。
特定ファイルのパフォーマンスを向上させるために、アクセラレイティド モードでファイルを開くことができます(バージョン 6.x トランザクショナル データベース エンジンはアクセラレイティド オープン要求を受け入れましたが、それらの要求をノーマル オープン要求と解釈していました)。アクセラレイティド モードでファイルを開くと、トランザクショナル データベース エンジンは、そのファイルに対するトランザクション ログを実行しません。
メモ
システム障害が発生すると、起動時に削除されないログ セグメントが生成される場合があります。これらのセグメントは、データ ファイルに完全に書き込まれなかった変更を含みます。これらのログ セグメントを削除しないで下さい。どのファイルがこれらのログ セグメントに書き込まれているかはわかりません。これらのデータ ファイルは、次回開かれたときに自動的にロール フォワードするので、何もする必要はありません。
Pervasive PSQLは、7.x トランザクション ログ ファイル形式を使用します。トランザクショナル インターフェイスがファイルでトランザクションのログを記録するには、トランザクショナル インターフェイスがログ内のレコードを追跡する際に使用できる重複のない(重複不可能)キーであるログ キーがファイルに含まれている必要があります。1 つ以上の重複のない(重複不可能)キーを持つファイルの場合、トランザクショナル インターフェイスはファイルで既に定義されている重複のないキーのうちの 1 つを使用します。
重複のないキーを持たないファイルの場合、トランザクショナル インターフェイスはファイル作成時にシステム データを含めることができます。トランザクショナル インターフェイスはファイルが 7.x 以降のファイル形式を使用している場合だけファイルにシステム データを含めます。その時点でファイルを作成する場合は、ファイル作成時にファイルにシステム データを含めるようにトランザクショナル インターフェイスが設定されます。システム データは、キー番号 125 で 8 バイトのバイナリ値として定義されます。たとえファイルに重複のないユーザー定義キーがあっても、ユーザーがインデックスを削除することから保護するためにシステム定義ログ キーとも呼ぶシステム データを使用しなければならない場合があります。
ファイルがシステム データを使用し、レコード長が表 12 に示した制限を超える場合、データベース エンジンではそのファイルに対し、データ圧縮を行います。
トランザクショナル インターフェイスがシステム データを追加するのはファイル作成時だけです。既存のファイルにシステム データを追加する場合は、[システム データの作成]設定オプションをオンにしてから Rebuild ユーティリティを使用します。
メモ
トランザクショナル インターフェイスがシステム データを追加すると、その結果、レコードが大きすぎてファイルの既存のページ サイズに収まらない場合があります。その場合、トランザクショナル インターフェイスは、ファイルのページ サイズを自動的に次の適切な大きさに調整します。
トランザクショナル データベース エンジンは、シャドウ ページングを使用して、システム障害が発生した場合に 6.0 以降のファイルが破壊されないようにします。クライアントがトランザクションの内部または外部のページの変更を要求すると、トランザクショナル データベース エンジンはデータ ファイル自体の空いた未使用の物理位置を選択し、シャドウ ページと呼ぶ新しいページ イメージをこの新しい場所に書き込みます。1 回のトランザクショナル インターフェイスの操作で、トランザクショナル データベース エンジンは元の論理ページとすべて同じサイズの複数のシャドウ ページを作成することがあります。
変更がコミットされる、つまり、オペレーションが終了するかトランザクションが終了すると、トランザクショナル データベース エンジンはシャドウ ページを現在のページにし、元のページが再利用可能になります。トランザクショナル データベース エンジンは、有効な再利用可能ページをトラッキングするために、ページ アロケーション テーブルというマップをファイルに格納します。変更がコミットされる前にシステム障害が発生した場合、トランザクショナル インターフェイスは PAT を更新しないため、シャドウ ページを削除し、まだ元の状態のままになっている現在のページを復帰させて使用します。
メモ
この説明では、シャドウ ページング プロセスを単純化しています。パフォーマンスの向上のため、トランザクショナル データベース エンジンは各オペレーションやユーザー トランザクションを個々にコミットせず、それらをシステム トランザクションと呼ぶまとまりにグループ化します。
クライアントがトランザクション内で動作している場合、元の論理ページに対応するシャドウ ページはそのクライアントにしか見えません。ほかのクライアントが同じ論理ページにアクセスしなければならない場合、元の(未変更の)ページが表示されます。つまり、ほかのクライアントには、最初のクライアントがまだコミットしていない変更は表示されません。元のファイルは常に有効でありかつ内部一貫性があるので、シャドウ ページングにより信頼性は向上します。
メモ
バージョン 6.0 より前のトランザクショナル インターフェイスでは、プリイメージングを使用してシステム障害発生時にファイルが破壊されないようにしていました。Pervasive.SQL 7.0 でも、プリイメージングを使用してバージョン 6.0 より前のファイルを保護します。バージョン 6.0 より前のファイルを更新する前に、トランザクショナル インターフェイスは元のファイルから更新されるページを含むテンポラリ プリイメージ ファイルを作成します。トランザクショナル インターフェイスは次に、元のファイルで更新を行います。更新中にシステム障害が発生すると、トランザクショナル インターフェイスはプリイメージ ファイルを使用して元のファイルを復元できます。
定期的にファイルをバックアップすることは、データを保護する上で大切なステップです。
ファイルのバックアップについての詳細は、『Advanced Operations Guide』の「ログ、バックアップおよび復元」を参照してください。.
|