4.2.6 TAMテーブルの排他制御

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

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

<この項の構成>
(1) 排他制御モード
(2) 排他の指定単位
(3) 資源の排他解除待ちの設定

(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関数参照目的排他なし
排他あり参照排他2参照排他
更新目的参照排他2更新排他
dc_tam_rewrite関数参照排他3更新排他3
dc_tam_write関数更新目的参照排他2更新排他
「更新または追加」または「追加」目的更新排他1
dc_dam_delete関数更新排他1
(凡例)
-:該当しません。
注※1
テーブル全体が更新排他で確保されるため,ほかのトランザクションからはアクセスできません。
注※2
「参照型」または「追加・削除できない更新型」のテーブルでは,TAMサービス定義でテーブル排他モードを「排他しない」とした場合は,この排他は確保されません。
注※3
更新目的のdc_tam_read関数で,すでに資源は確保されています。