Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成の手引


4.2.6 TAMテーブルの排他制御

TAMテーブルの更新中に,ほかのUAPからのTAMテーブルを更新する処理が割り込むと,一つのレコードに二つの処理が同時に反映されて,テーブルの内容に矛盾が生じます。これを防ぐためにTAMテーブルにアクセスする関数内に排他制御の指定をします。排他制御することで,複数のUAPからアクセスされる各データ間の整合性が保証されます。

TAMテーブルはグローバルトランザクション単位に排他制御します。

〈この項の構成〉

(1) 排他制御モード

TAMテーブルアクセス時の排他の条件を排他制御モードといいます。排他制御モードには次の2種類があります。

参照目的の排他(共用モード PR Protected Retrieve)

排他したレコードの参照だけできます。ほかのグローバルトランザクションからの参照だけを許可します。

更新目的の排他(排他モード EX EXclusive)

排他したレコードまたはテーブルの参照,更新ができます。ほかのグローバルトランザクションからの参照,更新を禁止します。

(2) 排他の指定単位

オンライン中のTAMテーブルへアクセスするときの排他の指定単位には,次の2種類があります。

(a) レコード排他

レコード単位に排他制御します。レコードを参照目的で入力するときは,参照目的の排他をするか,または排他をしない(ほかのUAPに更新を許す)設定をします。更新目的の入力や更新では,更新目的の排他をします。確保された排他は,TAMテーブルへの処理を指定したトランザクションが終了したときに解除されます。

(b) テーブル排他

テーブル単位に排他制御します。TAMテーブルをテーブル排他でオープン時,およびレコードの追加/削除をしたときに,TAMテーブル全体に対して更新目的の排他をします。確保された排他は,TAMテーブルへの処理を指定したトランザクションが終了したときに解除されます。トランザクションを開始する前にオープンした場合は,テーブル排他はできません。

(3) 資源の排他解除待ちの設定

アクセスしようとしたTAMテーブルがすでにほかのUAPから排他を掛けられていた場合(排他エラー)に,アクセスした関数をエラーリターンするか,排他が解除されるのを待つかを,関数の引数に指定できます。

排他が解除されるのを待つと設定した場合に,デッドロックやタイムアウトが起こったときは,排他の解除を待っている関数がエラーリターンして,デッドロック情報が出力されます。デッドロックやタイムアウトで関数がエラーリターンした場合は,トランザクションの同期点を取得して,確保した資源をすべて解放してください。

COBOL言語で作成したUAPの場合,排他が解除されるのを待つかどうかを,次に示すどちらかで指定します。

COBOL言語のUAPの場合に排他解除待ちを指定する方法については,マニュアル「OpenTP1 システム定義」および「OpenTP1 プログラム作成リファレンス COBOL言語編」を参照してください。

TAMサービスの関数の排他指定と実際に排他される状態を次の表に示します。

COBOL言語のUAPの場合は,レコードへアクセスするAPIで排他を確保します。

表4‒9 TAMサービスの関数の排他指定と実際に排他される状態

TAMサービスの関数とフラグに設定した値

TAMテーブルへの排他

TAMレコードへの排他

dc_tam_open関数

テーブル排他

更新排他

※1

レコード排他

レコードにアクセスする関数で排他を確保

dc_tam_read関数

CBLDCTAM('FxxR'/'FxxU'/'VxxR'/'VxxU')

参照目的

('FxxR'/'VxxR')

排他なし

排他あり

参照排他※2

参照排他

更新目的

(FxxU'/'VxxU')

参照排他※2

更新排他

dc_tam_rewrite関数

参照排他※3

更新排他※3

dc_tam_write関数

CBLDCTAM('MFY '/'MFYS'/'STR '/'WFY '/'WFYS'/'YTR ')

更新目的

('MFY '/'WFY ')

参照排他※2

更新排他

「更新または追加」('MFYS'/'WFYS')または「追加」('STR '/'YTR ')目的

更新排他

※1

dc_tam_delete関数

CBLDCTAM('ERS '/'ERSR'/'ZRS '/'ZRSR')

更新排他

※1

(凡例)

−:該当しません。

注※1

テーブル全体が更新排他で確保されるため,ほかのトランザクションからはアクセスできません。

注※2

「参照型」または「追加・削除できない更新型」のテーブルでは,TAMサービス定義でテーブル排他モードを「排他しない」とした場合は,この排他は確保されません。

注※3

更新目的のdc_tam_read関数で,すでに資源は確保されています。

(4) 排他なし参照使用時の注意事項

レコード単位の排他制御ではレコードを参照目的で入力するときに排他をしない設定(排他なし参照)が選択できます。排他なし参照は,ほかのUAPからのアクセス状態に関係なくTAMアクセスができるので,性能を重視したい場合には有効な手段となります。ただし,使用に際しては特に次の点に注意してください。