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