12.2 TP1/Message Queueのトランザクション
TP1/Message Queueは,二相コミットに対応します。単相コミットの機能は提供しません。
アプリケーションでは登録操作と取り出し操作についてトランザクションへの参加を指定できます。登録操作では,MQPMO構造体のOptionsフィールドにMQPMO_SYNCPOINTを指定してください。取り出し操作では,MQGMO構造体のOptionsフィールドにMQGMO_SYNCPOINTを指定してください。明示的に指定しない場合,TP1/Message Queueでは,命令をトランザクション内から呼び出すかどうかで,トランザクションへの参加と不参加が決定されます。各オプション指定時の動作については,マニュアル「TP1/Message Queue プログラム作成リファレンス」を参照してください。
トランザクションへの参加と不参加の例を次に示します。
MQPUT(MQPMO_NO_SYNCPOINTを指定) /* トランザクションに参加しない */ MQGET(MQGMO_NO_SYNCPOINTを指定) /* トランザクションに参加しない */ dc_trn_begin() /* トランザクションの開始 */ MQGET(MQGMO_SYNCPOINTを指定) /* トランザクションに参加 */ MQGET(MQGMO_NO_SYNCPOINTを指定) /* トランザクションに参加しない */ MQPUT(MQPMO_SYNCPOINTを指定) /* トランザクションに参加 */ MQPUT(MQPMO_NO_SYNCPOINTを指定) /* トランザクションに参加しない */ dc_trn_unchained_commit() /* 同期点の取得 (トランザクションの終了) */
なお,トランザクション制御用オプションをリンケージしないでUAPを作成する場合,次の点に注意してください。
-
MQPUT命令およびMQPUT1命令
MQPMO構造体のOptionsパラメタにMQPMO_SYNCPOINTが指定され,トランザクション内でMQPUT命令またはMQPUT1命令が発行された場合,MQRC_SYNCPOINT_NOT_AVAILABLEでエラーリターンします。
MQPMO構造体のOptionsパラメタにMQPMO_SYNCPOINTおよびMQPMO_NO_SYNCPOINTが省略され,トランザクション内でMQPUT命令またはMQPUT1命令が発行された場合,MQRC_SYNCPOINT_NOT_AVAILABLEでエラーリターンします。
-
MQGET命令
MQGMO構造体のOptionsパラメタにMQGMO_SYNCPOINTが指定され,トランザクション内でMQGET命令が発行された場合,MQRC_SYNCPOINT_NOT_AVAILABLEでエラーリターンします。
MQGMO構造体のOptionsパラメタにMQGMO_SYNCPOINTおよびMQGMO_NO_SYNCPOINTが省略され,トランザクション内でMQGET命令が発行された場合,MQRC_SYNCPOINT_NOT_AVAILABLEでエラーリターンします。
-
MQCLOSE命令およびMQDISC命令
MQCLOSE命令またはMQDISC命令が発行されない状態でユーザアプリケーションが正常終了した場合,使用していた資源が解放されないことがあります。