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