9.4.1.1 トランザクションをコミットするための条件
tpcommit()
を正常に実行するには、次の条件を満たしていることが必要です。
- 呼出し側プロセスは、tpbegin()を呼び出してトランザクションを開始したプロセスと同じでなければなりません。
TPNOTRAN
フラグを設定しないで呼び出した場合、呼出し側プロセスに未処理のトランザクション応答が存在することはできません。- トランザクションの状態が「ロールバックのみ」ではなく、またタイムアウトになっていないことが必要です。
最初の条件を満たしていない場合、呼出しは失敗し、プロトコル・エラーを示すTPEPROTO
がtperrno(5)に設定されます。2番目または3番目の条件を満たしていない場合、呼出しは失敗し、トランザクションがロールバックされたことを示すTPEABORT
がtperrno()
に設定されます。トランザクションに未処理の応答があるときにtpcommit()
がイニシエータによって呼び出されると、トランザクションは中断され、トランザクションに関連する応答記述子が無効になります。参加リソースがtpcommit()
またはtpabort()
を呼び出しても、トランザクションには影響しません。
サービス呼出しでTPFAIL
が戻されるか、またはサービス・エラーが発生すると、トランザクションはロールバックのみの状態になります。「ロールバックのみ」のトランザクションに対してtpcommit()
が呼び出されると、この関数はトランザクションを取り消し、-1を返してtperrno(5)にTPEABORT
を設定します。すでにタイムアウトになっているトランザクションに対してtpcommit()
を呼び出した場合も同じ結果になり、tpcommit()
は -1を返してtperrno()
にTPEABORT
が設定されます。トランザクション・エラーの詳細は、「エラーの管理」を参照してください。
親トピック: 現在のトランザクションのコミット