Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成の手引


4.5.3 リソースマネジャ接続先選択機能

一つのリソースマネジャを複数の制御単位に分け,接続するユーザ名称などを変更してリソースマネジャに接続できます。この機能を,リソースマネジャ接続先選択機能といいます。リソースマネジャ接続先選択機能を使用すると,RPCメッセージの情報に応じてリソースマネジャの接続先を動的に変更するようにSPPを一度実装すれば,その後の業務拡大に伴ってデータベースのテーブルやサーバを追加することになっても,SPPを修正しないでデータベースの接続先を変更できます。これによって,肥大化するテスト工数や運用コストを削減できます。

この機能は,SPP,およびSUPでだけ使用できます。また,OpenTP1提供以外のリソースで使用できます。

リソースマネジャ接続先選択機能使用時にデータベースの接続先を追加する場合の例を示します。

図4‒24 リソースマネジャ接続先選択機能使用時にデータベースの接続先を追加する場合の例

[図データ]

  1. クライアントがSPP3にサービス要求を送信します。

  2. dc_trn_rm_select関数をリソースマネジャRM_XのZ3で発行し,リソースマネジャの接続先を設定します。

  3. Z3に対して接続,更新処理を実施します。

  4. 業務量の拡大により,Z4を追加します。

  5. SPP3に,Z4用のデータで新たなサービス要求を送信します。

  6. dc_trn_rm_select関数をリソースマネジャRM_XのZ4で発行し,リソースマネジャの接続先を設定します。

  7. Z4に対して接続,更新処理を実施します。

この図ではSPP1とSPP2がそれぞれZ1とZ2にだけ接続していますが,SPP3はdc_trn_rm_select関数【CBLDCTRN('RMSELECT')】を発行することで接続先を変更できるようにしています。

この機能を使用するには,トランザクションサービス定義のtrnstring定義コマンド,ユーザサービス定義およびユーザサービスデフォルト定義のtrnrmid定義コマンドを指定する必要があります。各定義コマンドについては,マニュアル「OpenTP1 システム定義」を参照してください。

〈この項の構成〉

(1) dc_trn_rm_select関数の動作

リソースマネジャの接続先をUAPの処理内でプロセス,またはトランザクションごとに選択する場合は,dc_trn_rm_select関数【CBLDCTRN('RMSELECT')】を使用します。

dc_trn_rm_select関数についてはマニュアル「OpenTP1 プログラム作成リファレンス C言語編」を,CBLDCTRN('RMSELECT')についてはマニュアル「OpenTP1 プログラム作成リファレンス COBOL言語編」を参照してください。

(a) dc_trn_rm_select関数の使用例

dc_trn_rm_select関数の使用例を次の図に示します。

図4‒25 dc_trn_rm_select関数の使用例

[図データ]

  1. dc_trn_rm_select関数を使用して,接続先となるリソースマネジャ名とリソースマネジャ拡張子を設定します。

  2. dc_trn_rm_select関数の処理の中で,接続先として指定されたリソースマネジャをオープンします。

  3. リソースマネジャの接続先を変更するため,dc_trn_rm_select関数を再度実行します。説明1.で指定されたリソースマネジャと接続先が異なる場合は,説明1.でオープンしたリソースマネジャをクローズします。

  4. dc_trn_rm_select関数の処理の中で,接続先として指定されたリソースマネジャをオープンします。

(b) dc_trn_rm_select関数の発行有無による動作の違い

trnrmid定義コマンドに-kオプションを指定したリソースマネジャは,dc_trn_rm_select関数で設定するまで,トランザクションから該当するリソースマネジャに接続できません。

dc_trn_rm_select関数の発行有無による動作の違いについて,次に示します。

図4‒26 dc_trn_rm_select関数の発行有無による動作の違い

[図データ]

最初のdc_trn_begin関数実行時は,dc_trn_rm_select関数を発行していない状態であるため,リソースマネジャRM_XのZ1またはZ2に対するxa_open関数は発行されません。しかし,2回目のdc_trn_begin関数実行時には,dc_trn_rm_select関数で接続先が設定されたため,リソースマネジャRM_XのZ1に対するxa_open関数が発行されます。

トランザクションAはリソースマネジャRM_Xに接続できませんが,トランザクションBはリソースマネジャRM_XのZ1に接続できます。

(c) dc_trn_rm_select関数がエラーリターンした場合の動作

dc_trn_rm_select関数がエラーになった場合は,指定したリソースマネジャは接続先として設定されません。

dc_trn_rm_select関数がエラーになった場合の動作について,次に示します。

図4‒27 dc_trn_rm_select関数がエラーになった場合の動作

[図データ]

2回目のdc_trn_rm_select関数がエラーリターンしたため,リソースマネジャRM_XのZ2は接続先として設定されないで,先に設定されたリソースマネジャRM_XのZ1がそのまま接続先として継続されます。

トラザクションAとBは,リソースマネジャRM_XのZ1に接続できます。

(2) trn_rm_open_close_scopeオペランド指定時の動作

リソースマネジャのxa_open関数とxa_close関数を発行するタイミングは,トランザクションサービス定義のtrn_rm_open_close_scopeオペランドで変更できます。ただし,リソースマネジャ接続先選択機能を使用した場合,xa_open関数の発行タイミングがtrn_rm_open_close_scopeオぺランドの指定と異なることがあります。

trn_rm_open_close_scopeオペランドの指定値別に,動作について説明します。

(a) trn_rm_open_close_scopeオペランドにprocessを指定した場合

trn_rm_open_close_scopeオペランドにprocessを指定した場合の動作を,次に示します。

図4‒28 trn_rm_open_close_scopeオペランドにprocessを指定した場合の動作

[図データ]

trnrmid定義コマンドに-kオプションが指定されたリソースマネジャでは,dc_rpc_open関数ではxa_open関数が発行されません。dc_trn_rm_select関数で設定されたリソースマネジャRM_XのZ1に対して,最初のdc_trn_begin関数でxa_open関数が発行されます。2回目のdc_trn_rm_select関数でリソースマネジャRM_XのZ2が設定されたため,そのタイミングでいったんリソースマネジャRM_XのZ1に対してxa_close関数を発行します。その後,dc_trn_begin関数でRM_XのZ2に対してxa_open関数が発行されます。

トランザクションAとBはリソースマネジャRM_XのZ1に接続可能で,トランザクションCはリソースマネジャRM_XのZ2に接続可能です。

(b) trn_rm_open_close_scopeオペランドにtransactionを指定した場合

trn_rm_open_close_scopeオペランドにtransactionを指定した場合の動作を,次に示します。

図4‒29 trn_rm_open_close_scopeオペランドにtransactionを指定した場合の動作

[図データ]

trnrmid定義コマンドに-kオプションが指定されたリソースマネジャでは,dc_rpc_open関数ではxa_open関数が発行されません。dc_trn_rm_select関数で設定されたリソースマネジャRM_XのZ1に対して,最初のdc_trn_begin関数でxa_open関数が発行され,dc_trn_unchained_commit関数でxa_close関数が発行されます。その後,トランザクションは接続先が変更されるまで同じリソースマネジャRM_XのZ1に接続します。2回目のdc_trn_rm_select関数でリソースマネジャRM_XのZ2が設定されますが,RM_XのZ1に対するxa_close関数は前回トランザクション完了時に発行済みであるため,このタイミングでリソースマネジャRM_XのZ1に対するxa_close関数は発行されません。

トランザクションAとBはリソースマネジャRM_XのZ1に接続可能で,トランザクションCはRM_XのZ2に接続可能です。

(3) 複数種類のリソースマネジャを指定する場合の動作

一つのトランザクションブランチから同一リソースマネジャへの接続は一つだけとなりますが,リソースマネジャが異なる場合は複数接続することができます。

複数種類のリソースマネジャを指定する場合の動作を,次に示します。

図4‒30 複数種類のリソースマネジャを指定する場合の動作

[図データ]

dc_trn_rm_select関数でリソースマネジャRM_XのZ1と,リソースマネジャRM_YのD1が設定されたため,最初のdc_trn_begin関数でそれぞれのリソースマネジャのxa_open関数を発行します。3回目のdc_trn_rm_select関数は,リソースマネジャRM_YのD2が指定されたためリソースマネジャRM_YのD1に対するxa_close関数を発行しますが,種別が異なるリソースマネジャであるRM_XのZ1に対するxa_close関数は発行しません。

トランザクションAはリソースマネジャRM_XのZ1とリソースマネジャRM_YのD1に接続可能で,トランザクションBはリソースマネジャRM_XのZ1とリソースマネジャRM_YのD2に接続可能です。

(4) trnrmid定義コマンドの-kオプションの指定有無による動作の違い

trnrmid定義コマンドに-kオプションを指定しない場合,trn_rm_open_close_scopeオぺランドの指定によってプロセス開始時,またはトランザクション開始時にxa_open関数が発行されます。そのため,同一リソースマネジャについて-kオプションがあるものとないものを指定すると,-kオプション指定のリソースマネジャをdc_trn_rm_select関数で接続先として設定しても,トランザクション開始時にxa_open関数がエラーとなります。

trnrmid定義コマンドの-kオプションの指定有無による動作の違いについて,次の図に示します。

図4‒31 trnrmid定義コマンドの-kオプションの指定有無による動作の違い

[図データ]

trnrmid定義コマンドに-kオプションが指定されていないため,リソースマネジャRM_XのZ2に対するxa_open関数は通常どおりdc_rpc_open関数で発行します。dc_trn_rm_select関数でリソースマネジャRM_XのZ1が設定されたため,dc_trn_begin関数でxa_open関数を発行しますが,リソースマネジャRM_XのZ2に対してxa_open関数を発行済みであるため,このxa_open関数はエラーとなります。

トランザクションAは,リソースマネジャRM_XのZ2に接続できます。

リソースマネジャ接続先選択機能を使用する場合は,ユーザサービス定義に指定する同一リソースマネジャの,すべてのtrnrmid定義コマンドで-kオプションの指定を同じにしてください。