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
が返されます。
親トピック: エラーの管理