11.23 通信規則

トランザクション・モードで実行するコードを記述する場合は、以下の基本的な通信規則に従います。

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