オンライン中に,UAPからDAMファイルにアクセス(ファイルの参照や更新)するときは,トランザクションの中での処理が前提です。トランザクションを開始する前にDAMファイルをオープンした場合は,オープン以降に開始したすべてのトランザクションを終了させてからDAMファイルをクローズしてください。
DAMファイルは,論理ファイル名を指定したdc_dam_open関数【CBLDCDAM('OPEN')】でオープンします。DAMファイルをオープンしたときに,そのファイルを識別する名称としてファイル記述子がリターンされます。オープン以降の処理(ファイルの入力,更新,出力)では,このファイル記述子を関数に設定してアクセスします。DAMファイルのクローズでもファイル記述子を設定したdc_dam_close関数【CBLDCDAM('CLOS')】でクローズします。ファイル記述子は,オープン以降の処理でもUAP内で保持しておいてください。
ファイル記述子が有効になる範囲を次に示します。
処理の途中でDAMファイルを論理閉塞,閉塞を解除,およびファイルの状態を参照するときは,論理ファイル名を使います。
複数の連続するブロックを,一括して入出力できます。DAMファイルを入出力するときに,アクセスするブロックの範囲を構造体として関数に設定します。ブロックの範囲は,相対ブロック番号で設定します。この構造体は複数個指定できます。
DAMファイルのブロックを参照するときは,dc_dam_read関数【CBLDCDAM('READ')】でブロックを入力します。そのとき,ほかのトランザクションからの参照または更新を許すかどうかを設定できます。
DAMファイルのブロックの更新は,dc_dam_read関数でブロックを入力したあとで,そのブロックを更新するためにdc_dam_rewrite関数【CBLDCDAM('REWT')】を呼び出します。
DAMファイルからブロックを入力しないで,ブロックに上書きする出力をする場合は,dc_dam_write関数【CBLDCDAM('WRIT')】を呼び出します。
DAMファイルのブロックを処理中に論理的な矛盾を発見した場合,そのDAMファイルに対してほかのUAPがアクセスできないように,UAPからdc_dam_hold関数【CBLDCDAM('HOLD')】を呼び出して閉塞できます。また,UAPからdc_dam_release関数【CBLDCDAM('RLES')】を呼び出して閉塞を解除できます。
オンライン中のDAMファイルのアクセス手順を次の図に示します。
図4-2 オンライン時のDAMファイルのアクセス
トランザクションの処理からDAMファイルにアクセスしてエラーが起こったときは,UAPからabort()を呼び出してトランザクションのプロセスを異常終了させてください。
以前にアクセスした関数によっては,同じトランザクション内からでも,一つのブロックに対するアクセスがエラーリターンすることがあります。エラーリターンするかどうかは,一つのトランザクション内から関数を呼び出したときと,異なるトランザクションから関数を呼び出したときで異なります。以前に呼び出した関数とDAMファイルのブロックにアクセスできる関数を表4-1と表4-2に示します。
表4-1 一つのトランザクション内で,同じブロックにアクセスできる関数(回復対象のDAMファイルの場合)
前回呼び出した関数 | 今回呼び出した関数 | 結果またはエラーリターンする値 |
---|---|---|
トランザクション内で,まだ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(出力) | DCDAMER_SEQER(01605) | |
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-2 異なるトランザクションで,同じブロックにアクセスできる関数(回復対象のDAMファイルの場合)
前回呼び出した関数 | 今回呼び出した関数 | 結果またはエラーリターンする値 |
---|---|---|
トランザクション内で,まだ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(更新目的の入力) | DCDAMER_EXCER(01602)※ | |
dc_dam_rewrite(更新) | DCDAMER_SEQER(01605) | |
dc_dam_rewrite(更新の取り消し) | DCDAMER_SEQER(01605) | |
dc_dam_write(出力) | DCDAMER_EXCER(01602)※ | |
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 (参照目的の入力 排他を指定) | 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_write (出力) | 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)※ |
DAMサービスの関数がDCDAMER_PROTO(COBOL言語の場合は01600)でエラーリターンする原因を次に示します。原因は呼び出した関数によって異なります。
使っているDAMファイルの状態を,オンライン中に参照できます。DAMファイルの状態を参照するときは,dc_dam_status関数【CBLDCDAM('STAT')】を呼び出します。
dc_dam_status関数で参照できる情報を次に示します。
dc_dam_status関数を呼び出すと,DAMサービスは情報を取得するための排他制御をします。そのため,dc_dam_status関数を頻繁に使うと,排他の解除待ちが起こってスループットが低下することがあります。オンライン中にDAMファイルの状態を参照するのは,必要最小限にしてください。