Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 TP1/Server Base Enterprise Option 使用の手引


3.7.1 資源の排他制御

TP1/EEではUAPで使用する資源を共用できるようにしています。一つの資源を複数のUAPが使用しても整合性を保つことができる機能を排他制御と呼びます。排他資源の占有,および待ち状態はeelcklsコマンドで表示できます。

〈この項の構成〉

(1) 排他制御の管理範囲と有効範囲

TP1/EEは,資源の排他要求時から排他資源の解除要求時まで排他を管理します。排他制御の管理単位は,グローバルトランザクションです。

排他制御の有効範囲は,一つのTP1/EEプロセス内だけです。ほかのTP1/EEプロセス上のUAPとの排他制御はできません。また,排他状態はリラン時に引き継がれません。

(2) 資源の排他要求

資源を確保するときは,UAPからee_lck_get関数を呼び出します。このとき,引数に資源名称,排他制御モードなどを指定します。資源名称はTP1/EEプロセス内で一意となる固有の名称にする必要があります。排他制御モードとは,同じ資源にアクセスするほかのUAPに対する排他の方式です。

排他制御モードには,資源を参照するだけのUAPとは資源を共用し,資源を更新するUAPだけを排他するPRモードと,一つのUAPが資源を占有し,ほかのUAPをすべて排他するEXモードがあります。

(a) 資源の共有・非共有

あるトランザクションが排他要求した資源を,ほかのトランザクションがすでに排他確保していた場合,使用中の排他制御モードと要求元の排他制御モードの組み合わせによって,資源を共有確保させるかどうか決めます。共有確保できない場合,UAPからの排他要求時にエラーリターンするか,資源の解放待ちとするかを指定できます。

使用中の排他制御モードとその組み合わせによる資源の共有を次の表に示します。

表3‒22 使用中の排他制御モードとその組み合わせによる資源の共有

使用中の排他制御モード

要求元の排他制御モード

PRモード

EXモード

PRモード

共有できます

共有できません

EXモード

共有できません

共有できません

(b) 排他モードの遷移

排他を確保できたときの排他要求の排他制御モードが,その資源の排他モードとなります。

グローバルトランザクションでは,同一資源に対して複数回排他要求をした場合,複数の排他制御モードが混在しないように,資源の排他モードを制御します。

排他モードの遷移について,次の図と表に示します。

図3‒49 排他モードの遷移

[図データ]

表3‒23 排他モードの遷移

項番

排他確保済みの資源の

排他制御モード

排他要求の

排他制御モード

遷移後の

排他制御モード

1

PRモード

PRモード

PRモード

2

EXモード

EXモード

3

EXモード

PRモード

EXモード

4

EXモード

EXモード

(3) 資源の排他の解除

次に示す方法で資源の排他を解除します。

また,排他をしたトランザクションが正常終了または異常終了した場合,TP1/EEのロックサービスによって自動的に排他は解除されます。これによって,UAPでの排他の解除漏れや,UAP異常終了が発生した場合でも,資源が不当に占有されることがなくなります。

なお,同一トランザクション内(グローバルトランザクションも含む)で,同一の資源に対して複数回排他要求をした場合,排他要求の回数分,排他の解除要求をする必要があります。

(4) 排他待ち

資源を排他する場合,すでにほかのUAPによって資源が排他状態であるとき,ee_lck_get関数の引数で資源を排他できるまで待つかどうかを指定できます。

資源を排他できるまで待つと指定した場合には,排他待ちの優先順位に従って,ほかのUAPが資源の排他を解除するまで待ちます。待たないと指定した場合は,すぐにエラーリターンします。なお,排他待ちの優先順位は資源の排他要求を行った順番によって決まります。資源の排他要求を行う順番がほかのUAPよりも早い場合,排他待ちの優先順位はほかのUAPよりも高くなります。排他待ちの優先順位が高い場合,排他待ちしている,優先順位の低いほかのUAPよりも先に資源を排他できます。

トランザクション関連定義のlck_wait_timeoutオペランドで排他待ち限界経過時間を指定すると,排他待ち状態がこの時間を超えたとき,その排他要求をエラーリターンします。このとき,確保しようとした資源に関する詳細がタイムアウト情報としてメッセージに出力されます。

TP1/EEでは,デッドロックの検知をしないため,トランザクション関連定義のlck_wait_timeoutオペランドで排他待ち限界経過時間を指定することをお勧めします。