 |
PSQL Programmer's Guide (v11) |
 |
|
Btrieve クライアント (トランザクショナル インターフェイス)
Btrieve クライアントとは、Btrieve 呼び出しを行うアプリケーション定義のエンティティです。各クライアントは Btrieve 呼び出しを実行でき、MicroKernel に登録されているファイルなどのリソースを個々に持ちます。また、MicroKernel はクライアントごとに排他トランザクションと並行トランザクションの両方の状態を保持します。
複数のクライアントを同時にサポートしなければならない場合は、パラメーターとしてクライアント ID を含む BTRVID 関数または BTRCALLID 関数を使用します。クライアント ID パラメーターは、MicroKernel がコンピューター上のクライアントを区別できるようにする 16 バイト構造体のアドレスです。以下に、クライアント ID を使用することが有効である場合の例を示します。
- すべて同時に処理されるいくつかのトランザクションを実行するマルチスレッド型アプリケーションを作成します。アプリケーションでは、Begin Transaction オペレーションごとに異なるクライアント ID を指定します。MicroKernel は、クライアント ID 別にトランザクションの状態を保持します。
- 2 つのクライアント ID を使用し、クライアント ID ごとにいくつかのファイルを開くアプリケーションを書きます。アプリケーションは BTRVID、BTRCALLID、または BTRCALLID32 を使って Reset オペレーションを実行できるので、MicroKernel は指定された 1 つのクライアント ID のファイルを閉じて、リソースを解放することができます。
- アプリケーション自体の複数のインスタンスが同時に動作できるようなアプリケーションを書きます。アプリケーションのデータの整合性をとるために、MicroKernel にはすべてのインスタンスが 1 つのクライアントであるように見えなければなりません。この場合、アプリケーションのどのインスタンスがその呼び出しを行っているかに関係なく、アプリケーションは各 Btrieve 呼び出しで同じクライアント ID パラメーターを提供します。
- Dynamic Data Exchange(DDE)サーバーの役割を果たすアプリケーションを書きます。Btrieve 呼び出しを行うサーバー アプリケーションは、サーバー アプリケーションへ要求を発信するアプリケーション間で返された情報を分配する必要があります。この場合、アプリケーションは各要求元のアプリケーションに異なるクライアント ID を割り当てることにより、複数のクライアント間に配信される情報を追跡するための手段を提供できます。
MicroKernel はいくつかの並行制御方法を提供し、いくつかの実装ツールを使用して、複数のクライアントが同じファイル内のレコードを並行してアクセスまたは変更しようとする場合に発生する可能性のある競合を解決します。
並行制御方法は以下のとおりです。
実装ツールは以下のとおりです。
- 明示的レコード ロック
- 暗黙レコード ロック
- 暗黙ページ ロック
- ファイル ロック
以降では、MicroKernel の並行制御方法について詳しく説明します。各セクションを読むとき、表 35 を参照してください。この表では、2 つのクライアントが同じファイルのアクセスまたは変更を行おうとする場合に発生する可能性のある競合のタイプをまとめています。この表 35 では、ローカル クライアントのアクションを説明しています。
メモ
アプリケーションが BTRVID 関数を使用して同じアプリケーション内で複数のクライアントの定義と管理を行う場合、そのようなクライアントはローカル クライアントと見なされます。
この表では、クライアント 1 は表の左端の列の略語によって識別されるアクションを実行し、次にクライアント 2 が表の上端の行の略語によって識別されるアクションのうちの 1 つを実行しようとします。
これらの略語によって表されるアクションについては、アクション コード で説明しています。
前提条件
表 35 は以下のことを前提としています。
- 表の特定のセルでは、クライアント 2 はクライアント 1 がアクションの実行を開始した後にアクションを実行しようとします。最初のアクションが終了しないと、第 2 のアクションは開始できません。
- クライアント 2 が更新または削除操作を実行するセルの場合、クライアント 2 はクライアント 1 がアクションを実行する前に、影響を受けるレコードをあらかじめ読み取っているものとします。
- アクション MDR および MTDR のようにクライアント 2 のアクションが明示的に記述されていない限り、双方の操作が読み取りであっても、更新または削除であっても、クライアント 1 と 2 は常に同じレコードに対してアクションを実行します。
- クライアント 2 のアクションが明示的に記述されていない限り(アクション ITDP を参照してください)、クライアント 1 と 2 がともに挿入、更新、または削除操作を実行する場合、両クライアントは共通するページのうち少なくとも 1 ページを変更します。
- クライアント 1 の挿入操作の後でクライアント 2 が変更を実行する場合、変更されるレコードは挿入されたレコードではありませんが、両レコードはファイル内の 1 つ以上のデータ ページ、インデックス ページ、または可変ページを共有しています。
アクション コード
RNL
|
トランザクションでない処理または並行トランザクションにおける、ロック要求を伴わない読み取り。
|
RWL
|
トランザクションでない処理または並行トランザクションにおける、ロック要求を伴う読み取り。
|
INT
|
トランザクションでない処理における挿入。
|
ICT
|
並行トランザクションにおける挿入。
|
ITDP
|
並行トランザクションにおける挿入。同様に並行トランザクション内にいるクライアント 1 が挿入、更新、または削除によって変更したページとは異なるページを変更する。
|
MNT
|
トランザクションでない処理における変更(更新または削除)。
|
MDR
|
トランザクションでない処理における変更。クライアント 1 によって変更されたレコードとは異なるレコードを変更する。
|
MCT
|
並行トランザクションにおける変更。
|
MTDR
|
並行トランザクションにおける変更。クライアント 1 によって変更されたレコードとは異なるレコードを変更する。
|
EXT
|
排他トランザクションにおける読み取り、挿入または変更。
|
競合コード
適用外
|
適用されません(該当なし)。
|
NC
|
クライアント 1 とクライアント 2 のアクション間に競合またはブロックはありません。
|
RB
|
レコード レベルのブロック。クライアント 2 は、クライアント 1 でかけられたレコード ロックのためにブロックされます。
|
PB
|
ページ レベルのブロック。クライアント 2 は、クライアント 1 でかけられたページ ロックのためにブロックされます。
|
FB
|
ファイル レベルのブロック。クライアント 2 は、クライアント 1 でかけられたファイル ロックのためにブロックされます。
|
RC
|
レコードの競合。初めクライアント 2 が読み取っていたレコードを後からクライアント 1 が変更したため、クライアント 2 は操作を実行できません。MicroKernel は、ステータス コード 80 を返します。
|
競合コード RB、PB、および FB の場合、クライアント 2 がノーウェイト タイプの操作(たとえば、ノーウェイト ロックを指定した読み取りや、500 バイアスを指定して開始された並行トランザクションでの挿入または変更など)を指定していない限り、MicroKernel はクライアント 2 のアクションを再試行します。ノーウェイトの操作の場合は、MicroKernel はエラー ステータス コードを返します。
表 35 ローカル クライアントに関して発生する可能性のあるファイル操作の競合
クライアント 2 のアクション
|
|
RNL
|
RWL
|
INT
|
ICT
|
ITDP
|
MNT
|
MDR
|
MCT
|
MTDR
|
EXT
|
クライアント 1 のアクション
|
|
|
|
|
|
|
|
|
|
|
RNL
|
NC
|
NC
|
NC
|
NC
|
適用外
|
NC
|
適用外
|
NC
|
適用外
|
NC
|
RWL
|
NC
|
RB
|
NC
|
NC
|
適用外
|
RB
|
適用外
|
RB
|
適用外
|
RB
|
INT
|
NC
|
NC
|
NC
|
NC
|
適用外
|
NC
|
適用外
|
NC
|
適用外
|
NC
|
ICT
|
NC
|
NC
|
PB
|
PB
|
NC
|
PB
|
適用外
|
PB
|
適用外
|
PB
|
MNT
|
NC
|
NC
|
NC
|
NC
|
適用外
|
RC
|
NC
|
RC
|
NC
|
NC
|
MCT
|
NC
|
RB
|
PB
|
PB
|
NC
|
RB
|
PB
|
RB
|
PB
|
PB
|
EXT
|
NC
|
FB
|
FB
|
FB
|
適用外
|
FB
|
FB
|
FB
|
FB
|
FB
|
以下に、表 35 でアクション コードの組み合わせを解釈するための例を示します。
- EXT-RWL の組み合わせ。クライアント 1 は、排他トランザクション内からファイルのレコードを読み取ります。クライアント 2 は、トランザクションでない処理モードから、ノーウェイト ロック バイアスを指定してファイルからレコードを読み取ろうとすると、ステータス コード 85(FB、ファイル レベルのブロック)を受け取ります。クライアント 2 がウェイト ロック バイアスを指定した場合、MicroKernel は操作を再試行します。
- ICT-ICT の組み合わせ。クライアント 1 は、並行トランザクション内からレコードを挿入します。クライアント 2 が同じファイルにレコードを挿入しようとした場合、MicroKernel は操作を再試行します。これは、この挿入操作で変更されるページのうちの 1 つが、クライアント 1 で実行された挿入操作によって既に変更されているからです。クライアント 2 が 500 バイアスを指定した並行トランザクションを開始した場合、MicroKernel はステータス コード 84 を返します(この表については、前提条件を参照してください)。
- ICT-ITDP の組み合わせ。この組み合わせは、クライアント 1 によって変更されたページをクライアント 2 が変更しないという点を除いては、ICT-ICT に似ています。この場合、クライアント 2 で試行された操作は正常終了します(NC、ブロックなし、競合なし)。
- MCT-MTDR の組み合わせ。クライアント 1 とクライアント 2 は異なるレコードを変更しますが、クライアント 2 はページ ロックでブロックされます。このブロックが発生するのは、変更されるレコードがファイル内のデータ ページ、インデックス ページまたは可変ページを共有しているからです(この表については、前提条件を参照してください)。
 複数のクライアントのサポート |
 受動的並行性(パッシブ コンカレンシー) (トランザクショナル インターフェイス) |
|