TAMテーブルの更新中に,ほかのUAPからのTAMテーブルを更新する処理が割り込むと,一つのレコードに二つの処理が同時に反映されて,テーブルの内容に矛盾が生じます。これを防ぐためにTAMテーブルにアクセスする関数内に排他制御の指定をします。排他制御することで,複数のUAPからアクセスされる各データ間の整合性が保証されます。
TAMテーブルはグローバルトランザクション単位に排他制御します。
TAMテーブルアクセス時の排他の条件を排他制御モードといいます。排他制御モードには次の2種類があります。
オンライン中のTAMテーブルへアクセスするときの排他の指定単位には,次の2種類があります。
レコード単位に排他制御します。レコードを参照目的で入力するときは,参照目的の排他をするか,または排他をしない(ほかのUAPに更新を許す)設定をします。更新目的の入力や更新では,更新目的の排他をします。確保された排他は,TAMテーブルへの処理を指定したトランザクションが終了したときに解除されます。
テーブル単位に排他制御します。TAMテーブルをテーブル排他でオープン時,およびレコードの追加/削除をしたときに,TAMテーブル全体に対して更新目的の排他をします。確保された排他は,TAMテーブルへの処理を指定したトランザクションが終了したときに解除されます。トランザクションを開始する前にオープンした場合は,テーブル排他はできません。
アクセスしようとした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 |