4.1.4 オンライン中のDAMファイルのアクセス(SUP,SPP,MHPからの操作)

オンライン中に,UAPからDAMファイルにアクセス(ファイルの参照や更新)するときは,トランザクションの中での処理が前提です。トランザクションを開始する前にDAMファイルをオープンした場合は,オープン以降に開始したすべてのトランザクションを終了させてからDAMファイルをクローズしてください。

<この項の構成>
(1) DAMファイルにアクセスするときの名称
(2) 複数ブロックの一括入出力
(3) ブロックの参照/更新手順
(4) DAMファイルの論理閉塞と解除
(5) トランザクション処理からのDAMファイルブロックへのアクセス(回復対象のDAMファイルの場合)
(6) DAMサービスの関数がDCDAMER_PROTOでエラーリターンする原因
(7) DAMファイルの状態の参照

(1) DAMファイルにアクセスするときの名称

DAMファイルは,論理ファイル名を指定したdc_dam_open関数CBLDCDAM('OPEN')でオープンします。DAMファイルをオープンしたときに,そのファイルを識別する名称としてファイル記述子がリターンされます。オープン以降の処理(ファイルの入力,更新,出力)では,このファイル記述子を関数に設定してアクセスします。DAMファイルのクローズでもファイル記述子を設定したdc_dam_close関数CBLDCDAM('CLOS')でクローズします。ファイル記述子は,オープン以降の処理でもUAP内で保持しておいてください。

ファイル記述子が有効になる範囲を次に示します。

処理の途中でDAMファイルを論理閉塞,閉塞を解除,およびファイルの状態を参照するときは,論理ファイル名を使います。

(2) 複数ブロックの一括入出力

複数の連続するブロックを,一括して入出力できます。DAMファイルを入出力するときに,アクセスするブロックの範囲を構造体として関数に設定します。ブロックの範囲は,相対ブロック番号で設定します。この構造体は複数個指定できます。

(3) ブロックの参照/更新手順

DAMファイルのブロックを参照するときは,dc_dam_read関数CBLDCDAM('READ')でブロックを入力します。そのとき,ほかのトランザクションからの参照または更新を許すかどうかを設定できます。

DAMファイルのブロックの更新は,dc_dam_read関数でブロックを入力したあとで,そのブロックを更新するためにdc_dam_rewrite関数CBLDCDAM('REWT')を呼び出します。

DAMファイルからブロックを入力しないで,ブロックに上書きする出力をする場合は,dc_dam_write関数CBLDCDAM('WRIT')を呼び出します。

(4) DAMファイルの論理閉塞と解除

DAMファイルのブロックを処理中に論理的な矛盾を発見した場合,そのDAMファイルに対してほかのUAPがアクセスできないように,UAPからdc_dam_hold関数CBLDCDAM('HOLD')を呼び出して閉塞できます。また,UAPからdc_dam_release関数CBLDCDAM('RLES')を呼び出して閉塞を解除できます。

オンライン中のDAMファイルのアクセス手順を次の図に示します。

図4-2 オンライン時のDAMファイルのアクセス

[図データ]

(5) トランザクション処理からのDAMファイルブロックへのアクセス(回復対象の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)
(凡例)
○:エラーになりません。
注※
flagsにDCDAM_WAITを設定した場合は,排他解除待ちになります。

(6) DAMサービスの関数がDCDAMER_PROTOでエラーリターンする原因

DAMサービスの関数がDCDAMER_PROTO(COBOL言語の場合は01600)でエラーリターンする原因を次に示します。原因は呼び出した関数によって異なります。

  1. dc_rpc_open関数(COBOL言語の場合はCBLDCRPC('OPEN '))を呼び出していません。
  2. 回復対象のDAMファイルの場合,ユーザサービス定義のatomic_updateの指定が'N'になっています。
  3. 次に示すように,UAPを正しくリンケージしていません。
    • DAMサービスのAPIでTAMファイルにアクセスする場合に使うライブラリ(-ltdam)を,不当にリンケージしています。
    • トランザクション制御用オブジェクトファイルのリソースマネジャ登録が間違っています。
  4. ユーザサービス定義のatomic_updateオペランドの指定が'N'の場合に,dc_dam_start関数(COBOL言語の場合はCBLDCDAM('STRT'))を呼び出していません(回復対象外のDAMファイルの場合)。

(7) DAMファイルの状態の参照

使っているDAMファイルの状態を,オンライン中に参照できます。DAMファイルの状態を参照するときは,dc_dam_status関数CBLDCDAM('STAT')を呼び出します。

dc_dam_status関数で参照できる情報を次に示します。

(a) dc_dam_status関数を使う場合の注意

dc_dam_status関数を呼び出すと,DAMサービスは情報を取得するための排他制御をします。そのため,dc_dam_status関数を頻繁に使うと,排他の解除待ちが起こってスループットが低下することがあります。オンライン中にDAMファイルの状態を参照するのは,必要最小限にしてください。