4.3.2 ISTテーブルの概要
ISTテーブルの概要について説明します。
- 〈この項の構成〉
(1) ISTテーブルへのアクセス環境
ISTテーブルは,各ノードの共用メモリ上にあるテーブルです。テーブルの実体にあたるファイルはありません。そのため,UAPからISTテーブルへアクセスできるのは,オンライン中だけです。オフライン環境では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レコードに反映してしまいます。
-