分散トランザクション処理機能 OpenTP1 解説

[目次][用語][索引][前へ][次へ]

4.4.3 ISTサービス(TP1/Shared Table Access)

複数のOpenTP1システムが,ノードをわたってテーブルを共用できる機能をISTサービスといいます。ISTサービスで使えるテーブルをISTテーブルといいます。ISTサービスを使うと,テーブルの実体がどのノードにあるかを意識しないで,UAPからデータを参照,更新できます。また,各ノードの業務状態を管理するために,メールとしてISTテーブルを使うこともできます。ただし,複数のノードにわたってデータを配布させる場合,次に示す条件の業務にはISTサービスはお勧めできません。

ISTテーブルを使う場合,各ノードのシステムにTP1/Shared Table Accessが組み込まれていることが前提となります。

ISTサービスの構成を次の図に示します。

図4-21 ISTサービスの構成

[図データ]

ISTサービスを使用するには,ノード間のISTテーブル定義の指定を合わせてください。図4-21の場合,ノードA,ノードB,およびノードCでISTテーブル定義に指定したテーブル名が合っていないため,予期しないテーブル情報を受信したとして,ノードAおよびノードBで,OpenTP1が終了するまで定期的にKFCA25533-Wメッセージを出力し続けます。

<この項の構成>
(1) ISTテーブルへのアクセス環境
(2) ISTテーブルの構造
(3) ISTテーブルへのアクセス
(4) ISTサービスの運用例
(5) ISTサービスの利用時の注意事項

(1) ISTテーブルへのアクセス環境

ISTテーブルは,各ノードの共用メモリ上にあるテーブルです。テーブルの実体にあたるファイルはありません。そのため,UAPからISTテーブルへアクセスできるのは,オンライン中だけです。オフライン環境ではISTテーブルにはアクセスできません。

(2) ISTテーブルの構造

UAPからISTテーブルのデータを参照,更新するときは,レコード単位でアクセスします。ISTテーブルは,複数のレコードから構成されます。UAPの処理では,一つのレコードへアクセスすることも,複数のレコードを一括して指定してアクセスすることもできます。

(3) ISTテーブルへのアクセス

UAPからISTテーブルへアクセスする手順については,マニュアル「OpenTP1 プログラム作成の手引」を参照してください。

ISTテーブルへのアクセスは,トランザクションの関数でコミット,ロールバックできません。

ISTテーブルでは,UAPから呼び出した関数ごとに排他制御しています。データの入力から更新まで,ISTテーブルを占有する制御はしていません。そのため,一つのテーブルに複数のUAPからアクセスした場合でも,デッドロックが起こることはありません。

(4) ISTサービスの運用例

ISTサービスの効果的な運用例を次の図に示します。

図4-22 ISTサービスの効果的な運用例

[図データ]

図4-22では,ISTテーブルAはノードAだけが更新し,ISTテーブルBはノードBだけが更新します。それぞれのノードで更新したデータは,ISTサービスが各ノードに通知および反映するので,更新されたISTテーブルは,どのノードでも参照できます。このように,ISTテーブルを更新するノードを一つに限定した運用が効果的です。

例えば,ISTテーブルAには,ノードAのステータス情報を書き込み,ISTテーブルBには,ノードBのステータス情報を書き込みます。ノードCが更新できるISTテーブルCを作成し,ISTテーブルCにノードCのステータス情報を書き込めば,各ノードで,全ノードのステータス情報を参照できます。ただし,自ノードで更新したISTテーブルの他ノードへの通知が完了するまでに必要な通信時間があります。この通信時間内は最新の情報が未反映のため,古い情報を参照することがあります。

(5) ISTサービスの利用時の注意事項

複数のノードでISTサービスを使う場合には,各ノードの時刻を合わせておく必要があります。ノード間で時刻が一致していないと,あるノードで更新したデータに対して,別のノードからの更新が反映されないことがあります。ISTサービスで複数のノードのISTレコード(ISTテーブル中のレコード)を更新する処理の流れを次の図に示します。

図4-23 ISTレコードの更新処理

[図データ]

  1. ノードAのISTテーブルAのISTレコード(レコード番号1)を更新するレコード更新データを作成します。
  2. 現在の時刻(マシン時刻:マイクロ秒精度)を取得し,レコード更新データにタイムスタンプとして付与します。
  3. ノードAの共用メモリ上の該当するISTレコードに設定されているタイムスタンプとレコード更新データに付与したタイムスタンプとを比較します。
    レコード更新データの方が新しい場合は,共用メモリ上のISTレコードを更新します。レコード更新データの方が古い場合は,共用メモリ上のISTレコードを更新しません。なお,ISTレコードを更新しない場合も,dc_ist_write関数は正常にリターンします。
  4. 共用メモリ上のISTレコードを更新した場合,ノードAでISTレコードを更新したことをノードBのISTサービスへ通知します。このとき,ISTレコードとISTレコードに付与したタイムスタンプも通知します。
  5. 更新されたISTレコードを受信したノードBのISTサービスは,ノード内の該当するISTレコードに設定されているタイムスタンプと受信したISTレコードのタイムスタンプとを比較します。
  6. 5.の結果,受信したISTレコードのタイムスタンプの方が新しいと判断した場合だけ,ノードBの該当するISTレコードを,受信したISTレコードの情報に更新します。

上記のように,ISTサービスでは,ISTレコードを更新するか,またはそのままとするかを,タイムスタンプを基に判断しています。次のような場合は,最新の更新データがISTレコードに反映されないことがあります。