4.1.7 DAMファイルの排他制御
DAMファイルの更新中に,ほかのUAPからの更新処理が割り込むと,一つの論理ファイルに二つの処理が同時に反映されて,ファイルの内容に矛盾が生じてしまいます。このようなことを防ぐため,DAMファイルにアクセスする関数で排他制御をします。排他を制御することで,複数のUAPからアクセスされるDAMファイルでも,データの整合性を保証できます。
-
DAMファイルへアクセスするトランザクションの範囲(回復対象のDAMファイルの場合)
DAMファイルへアクセスするときは,トランザクションブランチ単位の排他制御となります。そのため一つのグローバルトランザクションに属する複数のトランザクションブランチから同じブロックまたは同じファイルにアクセスしても,排他エラーになる場合があります。このようなエラーを避けるため,グローバルトランザクション単位で排他制御することもできます。グローバルトランザクション単位で排他制御する場合は,該当するDAMファイルのDAMサービス定義にグローバルトランザクション単位でアクセスすることを指定します。
グローバルトランザクション単位で排他制御する場合,トランザクションブランチごとにDAMファイルにアクセスしても,並列にアクセスできないで順次アクセスになります。そのため,トランザクションの性能が下がる場合があります。トランザクションブランチごとのDAMファイルへのアクセスを並列に処理させる場合は,グローバルトランザクション単位での排他制御は指定しないでください。
- 〈この項の構成〉
(1) 排他制御モード
(2) 排他の指定単位(回復対象のDAMファイルの場合)
オンライン中のDAMファイルへのアクセスに対する排他の指定単位には,次の2種類があります。
(3) 資源の排他解除待ちの設定(回復対象のDAMファイルの場合)
-
dc_dam_open関数
入出力しようとしたブロックが,すでにほかのトランザクションから排他をかけられていた場合(排他エラー),アクセスした関数をエラーリターンするか排他が解除されるのを待つかを,DAMファイルのオープン時にdc_dam_open関数の引数で設定できます。
ファイル排他でDAMファイルをオープンする場合,排他待ち種別は設定できません。
dc_dam_open関数でファイルをオープンしようとしたときに排他エラーが起こった場合は,無条件にエラーリターンします。
-
排他エラーが起こった場合,dc_dam_read関数とdc_dam_write関数の排他待ち種別(エラーリターンするか,排他が解除されるのを待つか)を設定できます。この設定を省略した場合は,dc_dam_open関数に設定した値に従います。
排他が解除されるのを待つと設定した場合に,デッドロックやタイムアウトが起こったときは,排他の解除を待っている関数がエラーリターンしたあと,デッドロック情報が出力されます。デッドロックやタイムアウトで関数がエラーリターンした場合は,トランザクションの同期点を取得して,確保した資源をすべて解放してください。