![]() |
![]() |
|
|
トランザクション・エラー
以下の節では、トランザクションに関連するエラーについて説明します。
致命的ではないトランザクション・エラー
トランザクション・エラーが発生すると、tperrno(5) に TPETRAN が返されます。ただし、このようなエラーの意味は、そのエラーを返す関数によって異なります。次の表は、トランザクション・エラーを返す関数と、考えられるエラーの原因を示しています。
トランザクション・エラー
致命的なトランザクション・エラー 致命的なトランザクション・エラーが発生した場合、アプリケーションでは、イニシエータで tpabort() を呼び出してトランザクションを明示的にアボートしなければなりません。そのため、トランザクションにとって致命的なエラーを認識することが大切です。次の 3 つの場合、トランザクションは失敗します。
トランザクションにとって致命的なプロトコル・エラーが発生するのは、トランザクションの不正なパーティシパントから tpcommit() が呼び出された場合だけです。このエラーは、アプリケーション内で開発段階に修正できます。
イニシエータまたはパーティシパントで障害が発生した後、またはトランザクションがタイムアウトになった後で、tpcommit() が呼び出されると、暗黙的なアボート・エラーになります。その場合、コミットは失敗するので、トランザクションをアボートする必要があります。
通信呼び出しで TPESVCERR、TPESVCFAIL、TPEOTYPE、または TPETIME が返された場合、tpabort() を呼び出してトランザクションを明示的にアボートしなければなりません。トランザクションを明示的にアボートする前に、未処理の呼び出し記述子を待つ必要はありません。ただし、これらの記述子は、呼び出しがアボートされた後は無効と見なされるので、トランザクション終了後にこれらの記述子へのアクセスを試みると、TPEBADDESC が返されます。
TPESVCERR、TPESVCFAIL、および TPEOTYPE の場合、トランザクションがタイムアウトにならない限り、引き続き通信呼び出しを行うことができます。これらのエラーが返された場合、トランザクションは「アボートのみ」にマークされます。これ以降の処理の結果を保持するには、flags パラメータに TPNOTRAN を設定して通信用の関数を呼び出します。このフラグを設定すると、「アボートのみ」にマークされたトランザクションで実行された処理は、トランザクションがアボートしてもロールバックされません。
トランザクション・タイムアウトが発生しても通信を続けることはできますが、次のような通信要求を行うことはできません。
そのため、非同期呼び出しを行うには、flags パラメータに TPNOREPLY、TPNOBLOCK、または TPNOTRAN を設定する必要があります。
ヒューリスティックな判断に関するエラー
tpcommit() 関数は、TP_COMMIT_CONTROL の設定に応じて、TPEHAZARD または TPEHEURISTIC を返します。
TP_COMMIT_CONTROL に TP_CMT_LOGGED を設定すると、2 フェーズ・コミットの第 2 フェーズの実行前にアプリケーションに制御が移ります。その場合、第 2 フェーズ中に発生したヒューリスティックな判断がアプリケーションで認識されないことがあります。
TPEHAZARD または TPEHEURISTIC は 1 フェーズ・コミットで返すことができます。ただし、これが可能なのは、トランザクションに関与しているリソース・マネージャが 1 つだけで、1 フェーズ・コミットでこのリソース・マネージャがヒューリスティックな判断を返すか、なんらかの障害の発生を示す場合です。
TP_COMMIT_CONTROL に TP_CMT_COMPLETE を設定すると、リソース・マネージャがヒューリスティックな判断を通知する場合は TPEHEURISTIC が返され、リソース・マネージャがなんらかの障害を通知する場合は TPEHAZARD が返されます。TPEHAZARD は、コミットの第 2 フェーズ (または 1 フェーズ・コミット) でパーティシパントになんらかの障害が発生し、トランザクションが正常終了したかどうかがわからない状況を示します。
![]() |
![]() |
![]() |
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|