分散トランザクション処理機能 OpenTP1 解説
TAMファイルサービスを使うと,OpenTP1ファイルシステム上のOpenTP1ファイル(直接編成ファイル)のデータに,メモリ上のテーブルからアクセスできます。そのため,データへのアクセス処理を高速にできます。また,トランザクションと同期して,OpenTP1ファイルの状態を管理できます。OpenTP1でTAMファイルを使う場合には,TP1/FS/Table Accessが必要です。
TAMファイルは,ユーザデータを格納するファイルです。DAMファイルがディスクのデータに直接アクセスするのに対して,TAMファイルはデータを単純構造テーブルとしてメモリにロードして,メモリ上のテーブルにアクセスします。TAMサービスが提供するこの単純構造テーブルをTAMテーブルといい,TAMテーブルを格納するファイルの実体をTAMファイルといいます。
TAMファイルを使うときは,TAMサービス定義を作成し,TAMテーブルとTAMファイルを対応づけます。TAMテーブルとTAMファイルは1対1に対応します。さらに,TAMサービス定義でTAMテーブルに任意の名称を指定します。このTAMテーブル名を使用して,TAMテーブルを運用します。
TAMテーブルとTAMファイルの関係を次の図に示します。
図4-18 TAMテーブルとTAMファイルの関係
TAMテーブルは,レコードのアドレスを管理する方式の違いで,ツリー形式とハッシュ形式に分けられます。TAMテーブルはレコードごとに,検索用のキー値で管理しています。ツリー形式とは,レコードごとに割り当てられたキー値の大小を基にアドレスを管理する形式です。ハッシュ形式とは,レコードごとに割り当てられたキー値をTAMサービス内部のハッシュ関数を用いて変換し,変換後の値を基にアドレスを管理する形式です。この変換後の値をハッシュ値といいます。
ハッシュ形式はメモリ効率が悪くなりますが,ツリー形式よりも高速にアクセスできます。メモリ量に余裕がある場合には,ハッシュ形式,余裕がない場合にはツリー形式でTAMテーブルを作成してください。ツリー形式とハッシュ形式については,「4.4.2(2) TAMテーブルの形式」を参照してください。
TAMテーブルおよびTAMファイルの概要を次の表に示します。
表4-11 TAMテーブルおよびTAMファイルの特長
説明する内容 | 特長 |
---|---|
ファイル構成とレコード形式 | TAMファイルは,直接編成ファイルです。事前にOpenTP1ファイルとして割り当てたファイルを使います。 レコード形式は固定長の非ブロック形式です。 |
アクセス形態 | キー値を使ったテーブルアクセス法で,ブロックを参照または更新します。TAMファイルには,次に示す3種類があります。
|
トランザクションとの関係 | トランザクション処理中に仮更新したレコードの内容は,トランザクションがコミットした時点で,メモリ上で実更新されます。トランザクションがロールバックした場合は,仮更新した内容は廃棄されます。 メモリ上で実更新されたレコードは,TAMファイルに反映されます。TAMサービスは,メモリ上で実更新されたレコードだけを,一定の間隔でTAMファイルへ書き込みます。 |
ファイルのバックアップとリストア | TAMファイルのバックアップとリストアには,次のコマンドを使います。
|
オンライン中のテーブルの追加 | オンライン中にTAMテーブルを追加する場合は,追加する物理ファイルを作成してから,tamaddコマンドを使います。tamaddコマンドでファイルを追加したあとで,tamrlesコマンドを実行すると,オンラインで使えるようになります。 |
オンライン中のファイルの削除 | オンラインで使っているファイルを切り離す場合はtamrmコマンドを,切り離したTAMファイルの物理ファイルを削除する場合はtamdelコマンドを使います。オンライン中にファイルを削除する場合は,tamrmコマンドで論理ファイルを切り離してから,物理ファイルをtamdelコマンドで削除します。 |
メモリが十分にある場合には,TAMファイルを使用すれば性能面で優れたシステムを構築できます。利用できるメモリ量が限られている場合には,DAMファイルを使用してください。
DAMファイルに入出力する関数で,TAMテーブルにアクセスできます。このため,使用できるメモリを増やした場合は,それまで使用していたUAPを変更しないで,ユーザデータをDAMファイルからTAMファイルに移せます。ユーザデータの一部をTAMファイルに移し,一部をDAMファイルに残すような場合にも有効です。
TAMサービスは,TAMテーブルのレコードとキー値の対応関係を基に,レコードのアドレスを管理します。通常,キー値はレコードの中にも含まれています。レコードにキー値を含めたくない場合は,tamcreコマンドで,レコードからキー値を削除できます。
ツリー形式では,中間の値を持つキー値をツリーのルートとして,それよりも大きな値を持つか小さな値を持つかによって,レコードをツリー構造で管理しています。ツリー形式は,ツリー構造に管理されたキー値の大小を順々に比較していくことでアドレスを求めるため,検索に時間が掛かります。
ハッシュ形式では,キー値をハッシュ値に変換し,ハッシュ値とレコードアドレスを対応づけることによって,レコードを管理しています。TAMテーブルの全レコードのうち,ハッシュ値とレコードアドレスを対応づけた領域をハッシュ域といいます。同じハッシュ値を持つレコードは,リスト構造で管理されます。リストで管理されたキー値を順々に比較していくことで,同じハッシュ値を持つレコードのアドレスを求めます。
ツリー形式とハッシュ形式で,アクセス時のキー値の指定方法が異なります。
TAMテーブルアクセス時のキー値の指定方法を次の表に示します。
表4-12 TAMテーブルアクセス時のキー値の指定方法
検索種別 | ツリー形式 | ハッシュ形式 |
---|---|---|
キー値=n | 指定されたキー値を持つレコードを検索します。指定されたキー値を持つレコードがない場合,エラーリターンします。 | |
キー値<n キー値>n キー値≦n キー値≧n |
指定されたキー値に最も近いキー値を持つ最初のレコードを検索します。 | エラーリターンします。 |
先頭検索※ | エラーリターンします。 | キー値を無視して,TAMファイルの先頭レコードを検索します。 |
NEXT検索※ | エラーリターンします。 | 指定されたキー値を持つレコードの,次のレコードを検索します。 |
ハッシュ形式の場合,全レコードのうちどれだけハッシュ域として使用するかを,TAMファイル作成時,tamcreコマンドの引数で指定します。ハッシュ域を大きく取った場合,ハッシュ値の重複が発生する確率が小さくなり,リストの検索が不要になる割合が増すため,検索が速くなります。ただし,リストの領域が小さくなり,リストが満杯になったとき,それ以上ハッシュ値の重複が発生すると,ハッシュ域に空きがあってもレコードを追加できないので,メモリ効率が悪くなります。ハッシュ域を小さく取った場合,ハッシュ値の重複が起きる確率が高まります。このため,リストを検索する割合が増して,検索が遅くなります。その代わり,メモリ効率は良くなります。
ハッシュ域を大きく取った場合と,小さく取った場合を次の図に示します。
図4-19 ハッシュ域を大きく取った場合と小さく取った場合
OpenTP1ファイルシステムを作成したあと,tamcreコマンドでTAMファイルを初期作成します。TAMファイルの作成と同時に初期データをTAMファイルに格納する場合には,まずファイルに初期データを格納しておきます。TAMファイルの初期作成時にtamcreコマンドの引数でファイルを指定すれば,OpenTP1が初期データをファイルからTAMファイルに複写します。TAMファイルの初期データを格納するこのファイルを,TAMデータファイルといいます。
TAMテーブルは,UAPからTAMテーブルのレコードにどのようにアクセスするかによって,参照型,追加・削除できない更新型,追加・削除できる更新型に分類できます。UAPからのレコードに対するアクセスを制限するために設定する,TAMテーブルの属性をアクセス形態といいます。アクセス形態を設定することで,TAMファイルを目的に応じて使い分けることができ,TAMテーブルのレコードを管理できます。
参照型は,レコードを参照することだけができるTAMテーブルです。オンライン中にレコードを追加したり,削除したり,更新したりすることはできません。
追加・削除できない更新型は,レコードを更新できますが,オンライン中にレコードを追加したり,レコードを削除したりすることはできません。追加・削除できる更新型は,オンライン中にレコードを追加したり,削除したり,更新したりできます。
OpenTP1の開始と同時にオンラインに組み込むTAMテーブルのアクセス形態は,TAMサービス定義で指定します。また,OpenTP1稼働中にオンラインに追加するTAMテーブルのアクセス形態は,tamaddコマンドの-aオプションで指定します。
TAMサービスは,ユーザが指定したタイミングで,TAMファイルに格納されているTAMテーブルをメモリにロードします。TAMテーブルをメモリにロードするタイミングを,ローディング契機といいます。OpenTP1の開始と同時にオンラインに組み込むTAMテーブルは,ローディング契機をTAMサービス定義で指定します。また,OpenTP1の稼働中にオンラインに追加するTAMテーブルの場合には,ローディング契機をtamaddコマンドの-oオプションで指定します。
tamloadコマンドでローディングしたTAMテーブルは,tamunloadコマンドでアンロードします。OpenTP1の開始と同時,またはオンラインへの追加と同時にローディングしたTAMファイルは,OpenTP1の終了時点で自動的にアンロードします。また,UAPからdc_tam_open関数を使ってローディングしたTAMファイルは,dc_tam_close関数を使った時点で自動的にアンロードします。
TAMテーブルのローディング契機とアンロードの方法を次の表に示します。
表4-13 TAMテーブルのローディング契機とアンロードの方法
TAMテーブルをオンラインに登録する時期 | ローディング契機(三つのローディング契機のうち一つを選択) | アンロードの方法※1 |
---|---|---|
OpenTP1の開始と同時※2 | OpenTP1の開始に伴ってTAMサービスが開始したとき | TAM終了時に自動 |
tamloadコマンドを入力したとき | コマンド入力 | |
dc_tam_open関数を使ってTAMテーブルをオープンしたとき | クローズ時に自動 | |
OpenTP1稼働中※3 | オンラインに登録されたとき | TAM終了時に自動 |
tamloadコマンドを入力したとき | コマンド入力 | |
dc_tam_open関数でTAMテーブルをオープンしたとき | クローズ時に自動 |
TAMテーブルの排他には,テーブル単位で排他をかけるテーブル排他と,レコード単位で排他をかけるレコード排他があります。
TAMテーブルやレコードがすでにほかのUAPから排他をかけられていた場合に,排他が解放されるのを待つかどうかを,dc_tam_open関数,dc_tam_read関数,dc_tam_write関数,dc_tam_delete関数の引数で指定します。排他の解除を待つ時間は,ロックサービス定義で指定します。この排他待ち限界経過時間が経過しても排他が解放されない場合には,エラーリターンします。
TAMテーブルは,グローバルトランザクション単位に排他をかけます。
TAMテーブルとDAMファイルの両方にアクセスするUAPを複数作成した場合に,UAP間でデッドロックが起こることがあります。デッドロックが起こった場合には,ユーザサービス定義で指定した,デッドロックを解消するための優先順位に従ってデッドロックを解消します。
TAMテーブルとDAMファイルの両方にアクセスした場合のデッドロックの例を,次の図に示します。
図4-20 TAMテーブルとDAMファイルの両方にアクセスした場合のデッドロックの例
TAMファイルのバックアップを,OpenTP1の業務中に取得できます。これをオンラインバックアップといいます。TAMファイルのバックアップを取得するコマンド(tambkupコマンド)に-oオプション指定して実行すると,オンライン中にTAMファイルをバックアップできます。
オンラインバックアップしたファイルでTAMファイルを回復すると,回復に使うアンロードジャーナルファイルの量が少なくて済みます。そのため,-oオプションを指定しないでバックアップしたファイルを使ってTAMファイルを回復する場合と比べて,TAMファイルの回復処理に掛かる時間が少なくて済みます。
-oオプションを指定しない場合は,オフライン状態でバックアップすることになります。この場合,次の手順でバックアップしてください。
TAMファイルのバックアップ先に標準出力を,リストアの入力ファイルに標準入力を使うことができます。標準入出力を使うことで,コマンドのリダイレクトができるようになります。
標準入出力を使う場合には,tambkupコマンドおよびtamrstrコマンドに-sオプションを指定して実行します。
All Rights Reserved. Copyright (C) 2006, 2012, Hitachi, Ltd.