4.2.6 TAMテーブルの排他制御
TAMテーブルの更新中に,ほかのUAPからのTAMテーブルを更新する処理が割り込むと,一つのレコードに二つの処理が同時に反映されて,テーブルの内容に矛盾が生じます。これを防ぐためにTAMテーブルにアクセスする関数内に排他制御の指定をします。排他制御することで,複数のUAPからアクセスされる各データ間の整合性が保証されます。
TAMテーブルはグローバルトランザクション単位に排他制御します。
(2) 排他の指定単位
オンライン中のTAMテーブルへアクセスするときの排他の指定単位には,次の2種類があります。
(3) 資源の排他解除待ちの設定
アクセスしようとしたTAMテーブルがすでにほかのUAPから排他を掛けられていた場合(排他エラー)に,アクセスした関数をエラーリターンするか,排他が解除されるのを待つかを,関数の引数に指定できます。
排他が解除されるのを待つと設定した場合に,デッドロックやタイムアウトが起こったときは,排他の解除を待っている関数がエラーリターンして,デッドロック情報が出力されます。デッドロックやタイムアウトで関数がエラーリターンした場合は,トランザクションの同期点を取得して,確保した資源をすべて解放してください。
COBOL言語で作成したUAPの場合,排他が解除されるのを待つかどうかを,次に示すどちらかで指定します。
-
TAMサービス定義のtam_cbl_levelオペランド
-
COBOL-UAP作成用プログラムCBLDCTAMのデータ名Iの設定
COBOL言語のUAPの場合に排他解除待ちを指定する方法については,マニュアル「OpenTP1 システム定義」および「OpenTP1 プログラム作成リファレンス COBOL言語編」を参照してください。
TAMサービスの関数の排他指定と実際に排他される状態を次の表に示します。
COBOL言語のUAPの場合は,レコードへアクセスするAPIで排他を確保します。
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アクセスができるので,性能を重視したい場合には有効な手段となります。ただし,使用に際しては特に次の点に注意してください。
-
排他制御を行わないので,同一データに対して参照と更新が競合する可能性のある業務には適しません。
-
UAPからの更新結果が共用メモリ上のTAMテーブルに反映されるのは,更新を行ったUAPのコミット完了の時点です。それまでは,ほかのUAPからは更新前のデータしか見ることができません。
その一例を次に示します。
図4‒8 更新後の情報が排他なし参照時に反映されない例 (1)UAP1よりTAMの更新を行う
(2)UAP1よりdc_mcf_execapでUAP2(MHP)を起動する
(3)UAP2から,(1)で更新したTAMの情報を参照する(排他なし参照)
この場合,(3)のタイミングでは(1)の更新結果が共用メモリ上のTAMテーブルに反映されている保証はありません。UAP2が更新後の情報を期待しているようなアプリケーション設計を行うと処理不正となる可能性があります。
したがって,このような場合には,(3)では排他ありの参照を行う必要があります。