分散トランザクション処理機能 OpenTP1 プログラム作成の手引
![[目次]](FIGURE/CONTENT.GIF)
![[索引]](FIGURE/INDEX.GIF)
![[前へ]](FIGURE/FRONT.GIF)
DAMファイルの更新中に,ほかのUAPからの更新処理が割り込むと,一つの論理ファイルに二つの処理が同時に反映されて,ファイルの内容に矛盾が生じてしまいます。このようなことを防ぐため,DAMファイルにアクセスする関数で排他制御をします。排他を制御することで,複数のUAPからアクセスされるDAMファイルでも,データの整合性を保証できます。
- DAMファイルへアクセスするトランザクションの範囲(回復対象のDAMファイルの場合)
DAMファイルへアクセスするときは,トランザクションブランチ単位の排他制御となります。そのため一つのグローバルトランザクションに属する複数のトランザクションブランチから同じブロックまたは同じファイルにアクセスしても,排他エラーになる場合があります。このようなエラーを避けるため,グローバルトランザクション単位で排他制御することもできます。グローバルトランザクション単位で排他制御する場合は,該当するDAMファイルのDAMサービス定義にグローバルトランザクション単位でアクセスすることを指定します。
グローバルトランザクション単位で排他制御する場合,トランザクションブランチごとにDAMファイルにアクセスしても,並列にアクセスできないで順次アクセスになります。そのため,トランザクションの性能が下がる場合があります。トランザクションブランチごとのDAMファイルへのアクセスを並列に処理させる場合は,グローバルトランザクション単位での排他制御は指定しないでください。
- <この項の構成>
- (1) 排他制御モード
- (2) 排他の指定単位(回復対象のDAMファイルの場合)
- (3) 資源の排他解除待ちの設定(回復対象のDAMファイルの場合)
- (4) オンライン時とオフライン時の排他
(1) 排他制御モード
DAMファイルアクセス時の排他の条件を排他制御モードといいます。排他制御モードには,次の2種類があります。
- 参照目的の排他(共用モード PR Protected Retrieve)
- UAPは排他指定したファイルの参照だけできます。ほかのトランザクションには,参照だけを許可します。
- 更新目的の排他(排他モード EX EXclusive)
- UAPは排他指定したファイルの参照,更新ができます。ほかのトランザクションには,参照,更新を禁止します。
オンライン中のDAMファイルへのアクセスに対する排他の指定単位には,次の2種類があります。
ブロック単位に排他制御をします。ブロックを参照するときは共用モードの排他が掛かり,ブロック更新,またはブロック出力時には排他モードの排他が掛かります。参照目的での排他指定は,オプションの指定で排他をしない(ほかのUAPに参照/更新を許す)こともできます。確保された排他の指定は,DAMファイルへの処理を指定したトランザクション処理が正常終了したときに解除されます。
論理ファイル単位で排他制御します。論理ファイル全体に対して,ファイルのオープンからトランザクション処理の正常終了まで排他が掛かります。
ファイル排他を指定できるのは次の場合です。
- トランザクションブランチ単位で排他制御する指定で,トランザクションの範囲内で論理ファイルをオープンした場合
次に示す場合は,ファイル排他を指定できません。ブロック排他で排他制御をしてください。
- トランザクションの範囲外で論理ファイルをオープンした場合
- グローバルトランザクション単位で排他制御する指定をした場合
- dc_dam_open関数
入出力しようとしたブロックが,すでにほかのトランザクションから排他をかけられていた場合(排他エラー),アクセスした関数をエラーリターンするか排他が解除されるのを待つかを,DAMファイルのオープン時にdc_dam_open関数の引数で設定できます。
ファイル排他でDAMファイルをオープンする場合,排他待ち種別は設定できません。
dc_dam_open関数でファイルをオープンしようとしたときに排他エラーが起こった場合は,無条件にエラーリターンします。
- dc_dam_read関数とdc_dam_write関数
排他エラーが起こった場合,dc_dam_read関数とdc_dam_write関数の排他待ち種別(エラーリターンするか,排他が解除されるのを待つか)を設定できます。この設定を省略した場合は,dc_dam_open関数に設定した値に従います。
排他が解除されるのを待つと設定した場合に,デッドロックやタイムアウトが起こったときは,排他の解除を待っている関数がエラーリターンしたあと,デッドロック情報が出力されます。デッドロックやタイムアウトで関数がエラーリターンした場合は,トランザクションの同期点を取得して,確保した資源をすべて解放してください。
オンラインで使っているDAMファイルは,オフラインでアクセスできません。オンラインで使っているDAMファイルにオフラインのアクセスをする場合は,damhold,damrmコマンドで,いったんオンラインから削除してからオフラインでアクセスしてください。その後,damaddコマンドでオンラインに復帰させてください。
オフライン時でも,異なるUAPが同じDAMファイルに同時にはアクセスできません。DAMファイルをオープンしたUAPのプロセスが,クローズするまでそのDAMファイルを占有します。
All Rights Reserved. Copyright (C) 2006, 2012, Hitachi, Ltd.