![]() |
![]() |
|
|
トランザクション・エラー
以下の節では、トランザクションに関連するエラーについて説明します。
致命的ではないトランザクション・エラー
トランザクション・エラーが発生すると、TP-STATUS に TPETRAN が返されます。ただし、このようなエラーの意味は、そのエラーを返す呼び出しによって異なります。次の表は、トランザクション・エラーを返す呼び出しと、考えられるエラーの原因を示しています。
トランザクション・エラー
致命的なトランザクション・エラー 致命的なトランザクション・エラーが発生した場合、アプリケーションでは、イニシエータで TPABORT を呼び出してトランザクションを明示的にアボートしなければなりません。そのため、トランザクションにとって致命的なエラーを認識することが大切です。次の 3 つの場合、トランザクションは失敗します。
トランザクションにとって致命的なプロトコル・エラーが発生するのは、トランザクションの不正なパーティシパントから TPCOMMIT が呼び出された場合だけです。このエラーは、アプリケーション内で開発段階に修正できます。
イニシエータまたはパーティシパントで障害が発生した後、またはトランザクションがタイム・アウトになった後で、TPCOMMIT が呼び出されると、暗黙的なアボート・エラーになります。その場合、コミットは失敗するので、トランザクションをアボートする必要があります。
通信呼び出しで TPESVCERR、TPESVCFAIL、TPEOTYPE、または TPETIME が返された場合、TPABORT を呼び出してトランザクションを明示的にアボートしなければなりません。トランザクションを明示的にアボートする前に、未処理の通信ハンドルを待つ必要はありません。ただし、これらの通信ハンドルは、呼び出しがアボートされた後は無効と見なされるので、トランザクション終了後にこれらのハンドルへのアクセスを試みると、TPEBADDESC が返されます。
TPESVCERR、TPESVCFAIL、および TPEOTYPE の場合、トランザクションがタイム・アウトにならない限り、引き続き通信呼び出しを行うことができます。これらのエラーが返された場合、トランザクションは「アボートのみ」にマークされます。これ以降の処理の結果を保持するには、TPNOTRAN を設定して通信用の関数を呼び出します。このフラグを設定すると、「アボートのみ」にマークされたトランザクションで実行された処理は、トランザクションがアボートしてもロールバックされません。
トランザクション・タイム・アウトが発生しても通信を続けることはできますが、次のような通信要求を行うことはできません。
したがって、非同期呼び出しを行うには、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.
|