4.4.3 ISTサービス(TP1/Shared Table Access)
複数のOpenTP1システムが,ノードをわたってテーブルを共用できる機能をISTサービスといいます。ISTサービスで使えるテーブルをISTテーブルといいます。ISTサービスを使うと,テーブルの実体がどのノードにあるかを意識しないで,UAPからデータを参照,更新できます。また,各ノードの業務状態を管理するために,メールとしてISTテーブルを使うこともできます。ただし,複数のノードにわたってデータを配布させる場合,次に示す条件の業務にはISTサービスはお勧めできません。
-
データを即時に配布する必要がある業務
-
大量のデータを扱う必要がある業務
-
頻繁にデータを更新する業務
ISTテーブルを使う場合,各ノードのシステムにTP1/Shared Table Accessが組み込まれていることが前提となります。
ISTサービスの構成を次の図に示します。
ISTサービスを使用するには,ノード間のISTテーブル定義の指定を合わせてください。この図の場合,ノードA,ノードB,およびノードCでISTテーブル定義に指定したテーブル名が合っていないため,予期しないテーブル情報を受信したとして,ノードAおよびノードBで,OpenTP1が終了するまで定期的にKFCA25533-Wメッセージを出力し続けます。
(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サービスの効果的な運用例を次の図に示します。
この図では,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テーブル中のレコード)を更新する処理の流れを次の図に示します。
-
ノードAのISTテーブルAのISTレコード(レコード番号1)を更新するレコード更新データを作成します。
-
現在の時刻(マシン時刻:マイクロ秒精度)を取得し,レコード更新データにタイムスタンプとして付与します。
-
ノードAの共用メモリ上の該当するISTレコードに設定されているタイムスタンプとレコード更新データに付与したタイムスタンプとを比較します。
レコード更新データの方が新しい場合は,共用メモリ上のISTレコードを更新します。レコード更新データの方が古い場合は,共用メモリ上のISTレコードを更新しません。なお,ISTレコードを更新しない場合も,dc_ist_write関数は正常にリターンします。
-
共用メモリ上のISTレコードを更新した場合,ノードAでISTレコードを更新したことをノードBのISTサービスへ通知します。このとき,ISTレコードとISTレコードに付与したタイムスタンプも通知します。
-
更新されたISTレコードを受信したノードBのISTサービスは,ノード内の該当するISTレコードに設定されているタイムスタンプと受信したISTレコードのタイムスタンプとを比較します。
-
5.の結果,受信したISTレコードのタイムスタンプの方が新しいと判断した場合だけ,ノードBの該当するISTレコードを,受信したISTレコードの情報に更新します。
上記のように,ISTサービスでは,ISTレコードを更新するか,またはそのままとするかを,タイムスタンプを基に判断しています。次のような場合は,最新の更新データがISTレコードに反映されないことがあります。
-
ノードAのマシン時刻がノードBのマシン時刻よりも進んでいる場合
ノードAでISTレコードを更新したあとに,ノードBから同一のISTレコードの更新を通知されても,ノードAのISTレコードに設定されたタイムスタンプの方が新しいと判断します。そのため,ノードBで更新されたISTレコードの情報がノードAのISTレコードに反映されません。
また,ノードAで更新したISTレコードをノードBへ通知したときに,通知したISTレコードのタイムスタンプの方が新しいと判断されるため,ノードBの該当するISTレコードは,実際には最新の情報であっても,通知したISTレコードの情報に更新されてしまいます。
-
ノードAのマシン時刻がノードBのマシン時刻よりも遅れている場合
-
ノードBがISTレコードを更新して,そのISTレコードの情報がすでにノードAに通知されているとき
ノードBでISTレコードを更新したあとに,ノードAで同一のISTレコードを更新しても,更新処理をしないでdc_ist_write関数が正常リターンします。
-
ノードBがISTレコードを更新したが,そのISTレコードの情報がまだノードAに通知されていないとき
ノードBでISTレコードを更新したあとに,ノードAで同一のISTレコードを更新すると,ノードAの更新情報で,いったんISTレコードを更新しますが,そのあとにノードBから通知されたISTレコードのタイムスタンプの方が新しいと判断するため,ノードBから通知されたISTレコードの情報を,ノードAのISTレコードに反映してしまいます。
-