Hitachi

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


2.3.4 リモートプロシジャコールの形態と同期点の関係

トランザクションとして稼働しているUAP(SUP,SPP,MHP)からRPCで呼ばれたSPPにトランザクション属性が指定してある場合は,そのSPPはトランザクションとして稼働します。各トランザクションブランチは,一つのグローバルトランザクションとして同期を取れます。したがって,各サーバUAPのプロセスは,処理終了後,dc_rpc_call関数を呼び出したUAPにリターンしても,ルートトランザクションブランチに戻って同期点処理が完了するまでは,次のサービス要求を受け付けられません。また,サーバUAPで確保している資源も解放されません。これは非同期応答型RPC,非応答型RPC,連鎖RPCの場合でも同様です。

このように,UAPの処理ではRPCのトランザクション制御で,複数のUAPで同期が取れます。

クライアントUAPの同期点処理が完了する前に,サーバUAPのプロセスでほかのサービス要求を処理できる場合があります。これをトランザクションの最適化といいます。トランザクションの最適化については,「2.3.5 トランザクションの最適化」を参照してください。

〈この項の構成〉

(1) 同期応答型RPCと同期点の関係

同期応答型RPCのトランザクション処理の場合は,ルートトランザクションブランチに処理結果が戻って,同期点処理を終えた時点でトランザクションの終了となります。

トランザクションを最適化する条件がそろっている場合,サーバUAPのプロセスは処理が終了した時点で,次のサービス要求を受け付けられます。

同期応答型RPCと同期点の関係を次の図に示します。

図2‒32 同期応答型RPCと同期点の関係

[図データ]

(2) 非同期応答型RPCと同期点の関係

非同期応答型RPCのトランザクション処理の場合は,クライアントUAPで同期点処理を終えた時点でRPCの処理を終了とします。同期点処理後にサーバUAPから応答が返ってきても,dc_rpc_call関数を呼び出したUAPでは受信できません。

非同期応答型RPCと同期点の関係を次の図に示します。

図2‒33 非同期応答型RPCと同期点の関係

[図データ]

(3) 非応答型RPCと同期点の関係

非応答型RPCのトランザクション処理の場合は,クライアントUAPの同期点取得でサーバUAPの処理終了を待って,そのあとで同期点処理をします。

非応答型RPCと同期点の関係を次の図に示します。

図2‒34 非応答型RPCと同期点の関係

[図データ]

(4) 連鎖RPCと同期点の関係

連鎖RPCを使った場合は,一つのサーバUAPのプロセスで実行します。したがって,トランザクションブランチも連鎖RPCを使った回数に関係なく,一つになります。

連鎖RPCのトランザクション処理の場合,同期点処理を終了した時点でトランザクションが終了して,処理していたサーバUAPのプロセスは解放されます。

トランザクション実行中に非トランザクションの連鎖RPCを使った場合,通常は同期点処理を終了した時点で,処理していたサーバUAPのプロセスを解放します。同期点処理の終了で処理していたサーバUAPのプロセスを解放しないで,同期応答型RPC(flagsにDCNOFLAGSを指定)で解放する場合は,ユーザサービス定義のrpc_extend_functionオペランドに00000002を指定してください。

同期応答型RPCで連鎖RPCを終了した場合,トランザクションを最適化する条件がそろっているときは,サーバUAPのプロセスは処理が終了した時点で,次のサービス要求を受け付けられます。

連鎖RPCと同期点の関係を以降の図に示します。

図2‒35 連鎖RPCと同期点の関係(トランザクションの連鎖RPC)

[図データ]

図2‒36 連鎖RPCと同期点の関係(非トランザクションの連鎖RPCで終了しない指定をした場合)

[図データ]

(5) リモートプロシジャコールのエラーリターン値と同期点

dc_rpc_call関数,またはdc_rpc_poll_any_replies関数がエラーリターンしても,トランザクションの同期点がコミットとなる場合があります。

また,リターン値によっては,必ずトランザクションをロールバックさせなければならない場合があります。この場合は,ロールバックの関数(dc_trn_chained_rollback関数,またはdc_trn_unchained_rollback関数)でロールバックさせてください。

必ずロールバックさせなければならないdc_rpc_call関数,またはdc_rpc_poll_any_replies関数のリターン値については,マニュアル「OpenTP1 プログラム作成リファレンス」の該当する言語編の説明を参照してください。