2.10.5 ロックマイグレーション
ee_lck_get関数で資源の排他をする場合,一つのグローバルトランザクション内の各トランザクションブランチに,資源の占有権が順次移動します。この機能をロックマイグレーションといいます。ロックマイグレーションによって,トランザクションブランチ間の排他待ちやデッドロックを防げます。そのため,あるグローバルトランザクションで排他を指定した資源に対しては,その資源が解放されないかぎり,一つのグローバルトランザクション内のどのトランザクションブランチからでもアクセスできます。
ロックマイグレーションは,一つのTP1/EEプロセス内にグローバルトランザクションがある(グローバルトランザクションが複数のTP1/EEプロセスのサービスから構成されていない)場合に保証されます。
ロックマイグレーションの概要を次の図に示します。
(1) ロックマイグレーションと排他制御モード
ロックマイグレーションでは,PRモードで排他をしても,別のトランザクションブランチでEXモードを指定すれば,それ以降の排他はすべてEXモードになります。一つのグローバルトランザクション内では,一度EXモードで排他した資源には,PRモードで排他できません。すべてEXモードでの排他となります。
(2) ロックマイグレーションでの資源の解放
ロックマイグレーションの排他は,グローバルトランザクションが終了したときに,自動的に解放されます。グローバルトランザクションの終了を待たないで,排他を解除する方法を次に示します。
-
ee_lck_release_byname関数での解放
ロックマイグレーションの排他をコミット/ロールバックを待たないで解放するときは,資源名称を指定して排他を解除する関数(ee_lck_release_byname関数)を呼び出してください。排他の解除は,どのトランザクションブランチでもできます。この場合,グローバルトランザクション内でその資源に対して排他を指定した回数だけ,排他解除の関数を呼び出すまでは,資源は解放されません。
-
ee_lck_release_all関数での解放
全資源の排他を解除する関数(ee_lck_release_all関数)をどこかのトランザクションブランチで呼び出せば,どのトランザクションブランチで何回排他を指定していても,すべての資源の排他を解除できます。
(3) ロックマイグレーションでの注意事項
ロックマイグレーションでの注事項を次に示します。
-
同期応答型RPCのee_rpc_call関数【CBLEERPC('CALL ')】でロックマイグレーションが起こったあとで,このee_rpc_call関数がタイムアウトなどでエラーリターンした場合は,排他した資源に対するアクセス(確保済みの資源へのアクセスや新たな排他要求)はしないでください。アクセスした場合の動作は保証されません。
-
非応答型RPC,または非同期応答型RPCのee_rpc_call関数【CBLEERPC('CALL ')】でロックマイグレーションが起こった場合,ほかのトランザクションブランチで排他した資源に対して排他解除の関数を呼び出しても,解除できないことがあります。この場合,次のときに自動的に資源が解放されます。
-
資源の排他を行ったトランザクションブランチから,排他解除する関数を呼び出したとき。
-
グローバルトランザクションが終了したとき。
-