Hitachi

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


4.1.8 回復対象外のDAMファイルへのアクセス

トランザクションによる整合性の管理や障害時の回復を保証しないDAMファイルを作成できます。このようなDAMファイルを回復対象外のDAMファイルといいます。回復対象外のDAMファイルのブロックは,トランザクションの処理でなくても,dc_dam_write関数,dc_dam_rewrite関数で更新できます。

〈この項の構成〉

(1) 回復対象外のDAMファイルの定義

回復対象外にするDAMファイルを定義するときには,DAMサービス定義のdamfile定義コマンドに-nオプションを付けて指定します。

(2) 回復対象外のDAMファイルへのアクセス

ファイルへアクセスをする前にdc_dam_start関数【CBLDCDAM('STRT')】を,アクセスを完了するときにはdc_dam_end関数【CBLDCDAM('END ')】を呼び出します。dc_dam_start関数を呼び出したときは,アクセス終了後,必ずdc_dam_end関数を呼び出してください。

回復対象外のDAMファイルへは,DAMサービスの関数を使ってアクセスします。回復対象のDAMファイルへアクセスする場合と同様に,アクセスできます。

ファイルをオープンしたときのファイル記述子は,次に示すことが起こるまで有効です。

(3) ファイルアクセスでエラーが起こった場合の処置

回復対象外のDAMファイルへのアクセスでエラーが起こった場合でも,ファイルデータの障害は回復できません。

回復対象外のDAMファイルへのアクセス手順を次の図に示します。

図4‒5 回復対象外のDAMファイルへのアクセス手順

[図データ]

(4) 回復対象外のDAMファイルへアクセスする関数の関係

以前にアクセスした関数によっては,同じUAPの処理からでも,一つのブロックに対するアクセスがエラーリターンすることがあります。エラーリターンするかどうかは,一つのUAPから呼び出したときと異なるUAPから呼び出したときで異なります。以前に呼び出した関数とDAMファイルのブロックにアクセスできる関数を表4-3表4-4に示します。

表4‒3 一つのUAP内で,同じブロックにアクセスできる関数(回復対象外のDAMファイルの場合)

前回呼び出した関数

今回呼び出した関数

結果またはエラーリターンする値

dc_dam_start関数を呼び出したあと,まだDAMファイルにアクセスする関数を呼び出していない

dc_dam_read(参照目的の入力)

dc_dam_read(参照目的の入力 排他を指定)

dc_dam_read(更新目的の入力)

dc_dam_rewrite(更新)

DCDAMER_SEQER(01605)

dc_dam_rewrite(更新の取り消し)

DCDAMER_SEQER(01605)

dc_dam_write(出力)

dc_dam_read

(参照目的の入力)

dc_dam_read(参照目的の入力)

dc_dam_read(参照目的の入力 排他を指定)

dc_dam_read(更新目的の入力)

dc_dam_rewrite(更新)

DCDAMER_SEQER(01605)

dc_dam_rewrite(更新の取り消し)

DCDAMER_SEQER(01605)

dc_dam_write(出力)

dc_dam_read

(参照目的の入力 排他を指定)

dc_dam_read(参照目的の入力)

dc_dam_read(参照目的の入力 排他を指定)

dc_dam_read(更新目的の入力)

dc_dam_rewrite(更新)

DCDAMER_SEQER(01605)

dc_dam_rewrite(更新の取り消し)

DCDAMER_SEQER(01605)

dc_dam_write(出力)

dc_dam_read

(更新目的の入力)

dc_dam_read(参照目的の入力)

dc_dam_read(参照目的の入力 排他を指定)

dc_dam_read(更新目的の入力)

dc_dam_rewrite(更新)

dc_dam_rewrite(更新の取り消し)

dc_dam_write(出力)

dc_dam_rewrite

(更新)

dc_dam_read(参照目的の入力)

dc_dam_read(参照目的の入力 排他を指定)

dc_dam_read(更新目的の入力)

dc_dam_rewrite(更新)

DCDAMER_SEQER(01605)

dc_dam_rewrite(更新の取り消し)

DCDAMER_SEQER(01605)

dc_dam_write(出力)

dc_dam_rewrite

(更新の取り消し)

dc_dam_read(参照目的の入力)

dc_dam_read(参照目的の入力 排他を指定)

dc_dam_read(更新目的の入力)

dc_dam_rewrite(更新)

DCDAMER_SEQER(01605)

dc_dam_rewrite(更新の取り消し)

DCDAMER_SEQER(01605)

dc_dam_write(出力)

dc_dam_write

(出力)

dc_dam_read(参照目的の入力)

dc_dam_read(参照目的の入力 排他を指定)

dc_dam_read(更新目的の入力)

dc_dam_rewrite(更新)

DCDAMER_SEQER(01605)

dc_dam_rewrite(更新の取り消し)

DCDAMER_SEQER(01605)

dc_dam_write(出力)

(凡例)

○:エラーになりません。

表4‒4 異なるUAP内で,同じブロックにアクセスできる関数(回復対象外のDAMファイルの場合)

前回呼び出した関数

今回呼び出した関数

結果またはエラーリターンする値

dc_dam_start関数を呼び出したあと,まだDAMファイルにアクセスする関数を呼び出していない

dc_dam_read(参照目的の入力)

dc_dam_read(参照目的の入力 排他を指定)

dc_dam_read(更新目的の入力)

dc_dam_rewrite(更新)

DCDAMER_SEQER(01605)

dc_dam_rewrite(更新の取り消し)

DCDAMER_SEQER(01605)

dc_dam_write(出力)

dc_dam_read

(参照目的の入力)

dc_dam_read(参照目的の入力)

dc_dam_read(参照目的の入力 排他を指定)

dc_dam_read(更新目的の入力)

dc_dam_rewrite(更新)

DCDAMER_SEQER(01605)

dc_dam_rewrite(更新の取り消し)

DCDAMER_SEQER(01605)

dc_dam_write(出力)

dc_dam_read

(参照目的の入力 排他を指定)

dc_dam_read(参照目的の入力)

dc_dam_read(参照目的の入力 排他を指定)

dc_dam_read(更新目的の入力)

dc_dam_rewrite(更新)

DCDAMER_SEQER(01605)

dc_dam_rewrite(更新の取り消し)

DCDAMER_SEQER(01605)

dc_dam_write(出力)

dc_dam_read

(更新目的の入力)

dc_dam_read(参照目的の入力)

dc_dam_read(参照目的の入力 排他を指定)

DCDAMER_EXCER(01602)

dc_dam_read(更新目的の入力)

DCDAMER_EXCER(01602)

dc_dam_rewrite(更新)

DCDAMER_SEQER(01605)

dc_dam_rewrite(更新の取り消し)

DCDAMER_SEQER(01605)

dc_dam_write(出力)

DCDAMER_EXCER(01602)

dc_dam_rewrite

(更新)

dc_dam_read(参照目的の入力)

dc_dam_read(参照目的の入力 排他を指定)

dc_dam_read(更新目的の入力)

dc_dam_rewrite(更新)

DCDAMER_SEQER(01605)

dc_dam_rewrite(更新の取り消し)

DCDAMER_SEQER(01605)

dc_dam_write(出力)

dc_dam_rewrite

(更新の取り消し)

dc_dam_read(参照目的の入力)

dc_dam_read(参照目的の入力 排他を指定)

dc_dam_read(更新目的の入力)

dc_dam_rewrite(更新)

DCDAMER_SEQER(01605)

dc_dam_rewrite(更新の取り消し)

DCDAMER_SEQER(01605)

dc_dam_write(出力)

dc_dam_write

(出力)

dc_dam_read(参照目的の入力)

dc_dam_read(参照目的の入力 排他を指定)

dc_dam_read(更新目的の入力)

dc_dam_rewrite(更新)

DCDAMER_SEQER(01605)

dc_dam_rewrite(更新の取り消し)

DCDAMER_SEQER(01605)

dc_dam_write(出力)

(凡例)

○:エラーになりません。

注※

flagsにDCDAM_WAITを設定した場合は,排他解除待ちになります。

(5) 回復対象外のDAMファイルの排他制御

回復対象のDAMファイルと同様に,回復対象外DAMファイルでも排他制御をします。ここでは,回復対象外のDAMファイルの排他制御について説明します。回復対象のDAMファイルと回復対象外のDAMファイルの比較については,「4.1.8(6) 回復対象のDAMファイルと回復対象外のDAMファイルとの比較」を参照してください。

(a) 回復対象外のDAMファイルの排他範囲

回復対象外のDAMファイルの場合,トランザクションの範囲内かどうかに関係なく,DAMファイルへアクセスできます。

(b) 排他制御モード

回復対象外のDAMファイルの排他制御モードは,回復対象のDAMファイルと同じです。排他制御モードについては,「4.1.7(1) 排他制御モード」を参照してください。

(c) 排他の指定単位

回復対象外のDAMファイルの排他の指定単位は,回復対象のDAMファイルと同じです。排他の指定単位については,「4.1.7(2) 排他の指定単位(回復対象のDAMファイルの場合)」を参照してください。

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

回復対象外のDAMファイルの資源の排他解除待ちの設定は,次に示す点を除いて,回復対象のDAMファイルと同じです。

  • dc_dam_open関数に設定する排他解除待ちの種別は,dc_dam_open関数自体の指定を含みます。回復対象のDAMファイルの場合は,dc_dam_open関数で排他エラーが起こると無条件にエラーリターンしましたが,回復対象外のDAMファイルでは,引数に設定した排他待ち種別に従って処理できます。

資源の排他待ちの設定については,「4.1.7(3) 資源の排他解除待ちの設定(回復対象のDAMファイルの場合)」を参照してください。

(6) 回復対象のDAMファイルと回復対象外のDAMファイルとの比較

回復対象のDAMファイルと回復対象外のDAMファイルとの比較について説明します。アクセスの違いを表4-5に,アクセス時に排他制御する範囲の違いを表4-6に示します。

表4‒5 回復対象のDAMファイルと回復対象外のDAMファイルとのアクセスの違い

DAMサービスの関数

関数を呼び出す条件

DAMファイルの種類とアクセスする位置

回復対象DAMファイル

回復対象外

DAMファイル

トランザクション範囲外

トランザクション範囲

dc_dam_open

ファイル排他,排他解除待ち

×

ファイル排他,即時リターン

×

ブロック排他,排他解除待ち

ブロック排他,即時リターン

dc_dam_close

トランザクションの範囲でファイルをオープン

トランザクションの範囲外でファイルをオープン

×

dc_dam_read

参照目的の入力,排他なし

参照目的の入力,排他を指定

×

更新目的の入力,排他を指定

×

dc_dam_rewrite

更新目的の出力

×

更新の取り消し

×

dc_dam_write

(条件なし)

×

(凡例)

○:該当する条件で,関数を呼び出せます。

×:該当する条件で,関数を呼び出すとエラーリターンします。

−:該当する条件では,関数を呼び出せません。

表4‒6 回復対象のDAMファイルと回復対象外のDAMファイルとのアクセス時に排他制御する範囲の違い

排他の指定単位と呼び出す関数

排他制御モード

回復対象DAMファイルの場合

回復対象外DAMファイルの場合

ファイル

排他

dc_dam_open

EX

  • 同期点処理の終了まで排他

  • dc_dam_closeまたはdc_dam_endの理が終了するまで排他

ブロック

排他

dc_dam_read

(参照)

PR

  • 同期点処理の終了まで排他

  • dc_dam_readの処理が終了するまで排他

dc_dam_read

(更新)

EX

  • 同期点処理の終了まで排他

  • dc_dam_rewrite(取り消し)の処理が終了するまで排他

  • dc_dam_rewrite(更新または取り消し)の処理が終了するまで排他

dc_dam_write

EX

  • 同期点処理の終了まで排他

  • dc_dam_writeの処理が終了するまで排他

注※

ここで示す排他の指定単位は,dc_dam_open関数に設定した場合です。dc_dam_open関数にファイル排他を指定した場合,dc_dam_read関数,dc_dam_write関数に設定した排他の指定単位は無効です。