MHPは,OpenTP1のメッセージ受信によるMHPの開始から,MHPの終了まで,必ずトランザクションになります。つまり,MHPで扱う処理はすべてOpenTP1でトランザクションと見なして処理します。※
MHPのサービス関数では,トランザクション制御をする関数(dc_trn_begin関数など,dc_trnで始まる同期点取得の関数)は使えません。さらに,MHPからSPPのサービスを要求する場合,サービスを要求されたSPPでは,トランザクション制御をする関数は呼び出せません。MHPからSPPのサービスを要求するときは,そのSPPの処理でトランザクション制御をする関数を呼び出していないことを確認してください。
MHPは,ユーザサービス定義でトランザクション属性である(atomic_update=Y)ことを指定しておきます。
MHPの処理の中で,連鎖モードのコミットとして同期点を取得できます。同期点は,dc_mcf_commit関数【CBLDCMCF('COMMIT ')】で取得します。dc_mcf_commit関数が正常に終了すると,続くMHPの処理は新しいグローバルトランザクションとなります。
MHPから始まるグローバルトランザクションが,複数のトランザクションブランチから構成される場合(MHPからdc_rpc_call関数でSPPを呼び出しているとき)は,それぞれのトランザクションブランチの処理結果がコミットとならないかぎりコミットとなりません。コミットできない場合は,すべてのトランザクションブランチがロールバックされます。
メッセージを受信する前に,dc_mcf_commit関数で同期点を取得できません。また,dc_mcf_commit関数で同期点を取得したあとで,そのMHPでメッセージを受信できません。
dc_mcf_commit関数で同期点取得の対象となるメッセージ処理は,非同期のメッセージとアプリケーションプログラムの起動です。同期型のメッセージ送受信の処理は,同期点取得の対象にはなりません。
dc_mcf_commit関数は,MCFアプリケーション定義で非応答型(noans型)を指定したMHPからだけ呼び出せます。それ以外の型のMHPで呼び出した場合は,エラーリターンします。また,MHP以外のUAPでは,dc_mcf_commit関数は呼び出せません。
MHPが異常終了またはロールバック※1した場合は,エラーイベントが通知されます。dc_mcf_receive関数が先頭セグメントを受け取ったかどうかで,通知されるエラーイベントは異なります。
MHPのトランザクション処理がエラーとなったときは,メッセージを受信する前の状態に戻すため,ロールバック(dc_mcf_rollback関数【CBLDCMCF('ROLLBACK')】)をMHPで呼び出してください。メッセージを受け取ったMHPがロールバックしたときに,再びOpenTP1でMHPをスケジュールし直すかどうかは,dc_mcf_rollback関数の引数の指定に従います。
メッセージ送受信形態の処理とトランザクションの関係を次の図に示します。
図3-12 メッセージ送受信形態の処理とトランザクションの関係
MHPの処理で,メッセージ送受信機能の関数がエラーリターンしたあとで,リターンで処理を終了させた場合,そのトランザクション自体はコミットすることがあります。このようなMHPの処理の中でリソースマネジャ(RM)にアクセス(DAM,TAM)をしていれば,このアクセスの処理はコミットになります。アクセスの処理もロールバックとしたい場合は,エラーリターン後にdc_mcf_rollback関数を呼び出す処理を作成しておくか,abortを呼び出しておいてください。
MHPでも,サービス関数の処理範囲以外(メイン関数の処理範囲)ならば,トランザクションの開始(dc_trn_begin関数)を使えます。トランザクションの開始と同期点取得は,メイン関数のdc_rpc_open関数からdc_mcf_mainloop関数の間,またはdc_mcf_mainloop関数からdc_rpc_close関数の間で呼び出せます。
MHPのメイン関数でdc_trn_begin関数を呼び出したときは,そのメイン関数で必ず非連鎖モードのコミット(dc_trn_unchained_commit関数)を呼び出して同期点を取得してください。