11.23 通信規則
トランザクション・モードで実行するコードを記述する場合は、以下の基本的な通信規則に従います。
- 同じトランザクションに参加するプロセスでは、すべてのリクエストで応答が必要です。応答を必要としないリクエストを行うには、
tpacall()のflagsパラメータにTPNOTRANまたはTPNOREPLYを設定します。 - サービスは、
tpreturn()またはtpforward()を呼び出す前に、すべての非同期トランザクション応答を取得する必要があります。この規則には、コードをトランザクション・モードで実行するかどうかに関係なく従います。 - イニシエータは、
tpcommit()を呼び出す前に、すべての非同期トランザクション応答(TPNOTRANフラグが指定されていないもの)を取得する必要があります。 - トランザクションの参加リソース以外からの応答を必要とする非同期呼出しには、応答を取得する必要があります。つまり、応答が抑制されたのではなくトランザクションが抑制された
tpacall()で行ったリクエストに対する応答を取得する必要があります。 - トランザクションがタイムアウトになっていなくても、「中断のみ」としてマークされている場合、以降の通信では
TPNOTRANフラグを設定して、トランザクションがロールバックされた後でも通信の結果が保持されるようにします。 - トランザクションがタイムアウトされた場合は次のとおりです。
- タイムアウトになった呼出しの記述子は無効になり、以降この記述子を参照すると、
TPEBADDESCが返されます。 - 未処理の記述子の
tpgetrply()またはtprecv()を呼び出すと、トランザクション・タイムアウトについてのグローバル状態が返され、tperrno(5)にTPETIMEが設定されます。 - 非同期呼出しで、
tpacall()のflagsパラメータにTPNOREPLY、TPNOBLOCKまたはTPNOTRANを設定できます。
- タイムアウトになった呼出しの記述子は無効になり、以降この記述子を参照すると、
- タイムアウト以外の理由でトランザクションが一度「中断のみ」とマークされると、
tpgetrply()の呼出しでは、呼出しのローカル状態を表す値が戻され、ローカル条件を反映する成功コードまたはエラー・コードのいずれかが戻されます。 - 応答を取得するために
tpgetrply()で一度記述子を使用した場合、またはエラー条件を通知するためにtpsend()またはtprecv()で一度記述子を使用した場合、その記述子は無効になり、以降この記述子を参照するとTPEBADDESCが返されます。この規則には、コードをトランザクション・モードで実行するかどうかに関係なく従います。 - トランザクションが一度中断されると、未処理のトランザクションの呼出し記述子(
TPNOTRANフラグが設定されていないもの)はすべて無効になり、以降この記述子を参照するとTPEBADDESCが返されます。
親トピック: エラーの管理