BEA Logo BEA Tuxedo Release 8.0

  BEA ホーム  |  イベント  |  ソリューション  |  パートナ  |  製品  |  サービス  |  ダウンロード  |  ディベロッパ・センタ  |  WebSUPPORT

 

   Tuxedo ホーム   |   C 言語を使用した BEA Tuxedo アプリケーションのプログラミング   |   先頭へ   |   前へ   |   次へ   |   目次

 


トランザクション・エラー

以下の節では、トランザクションに関連するエラーについて説明します。

致命的ではないトランザクション・エラー

トランザクション・エラーが発生すると、tperrno(5)TPETRAN が返されます。ただし、このようなエラーの意味は、そのエラーを返す関数によって異なります。次の表は、トランザクション・エラーを返す関数と、考えられるエラーの原因を示しています。

トランザクション・エラー

関数

原因

tpbegin()

通常は、トランザクションの開始を試みたときに発生する一時的なシステム・エラーが原因で起こります。呼び出しを繰り返し行うと、問題が解決します。

tpcancel()

TPNOTRAN フラグを設定しないで要求を行った後、トランザクション応答を取得するためにこの関数が呼び出されました。

tpresume()

呼び出し元が、1 つ以上のリソース・マネージャとグローバル・トランザクション外の作業に関与しているため、 BEA Tuxedo システムがグローバル・トランザクションを再開できません。そのような作業はすべて、グローバル・トランザクションを再開する前に完了していなければなりません。ローカル・トランザクションについての呼び出し元の状態は、変更されません。

tpconnect()tppost()tpcall()tpacall()

トランザクションがサポートされていないサービスに対して、トランザクション・モードで呼び出しが行われました。サービスには、データベース管理システム (DBMS) にアクセスし、その結果トランザクションがサポートされるサーバ・グループに属するものがあります。そのようなグループに属さないサービスもあります。また、トランザクションがサポートされたサービスには、トランザクションがサポートされていないソフトウェアとの相互運用を必要とするものがあります。たとえば、フォームを出力するサービスの処理が、トランザクションがサポートされていないプリンタで行われる場合があります。トランザクションがサポートされていないサービスは、トランザクションのパーティシパントとして動作できない場合があります。

サービスをサーバやサーバ・グループにグループ分けする作業は、管理タスクの 1 つです。どのサービスでトランザクションがサポートされているかを確認するには、アプリケーション管理者に問い合わせてください。

トランザクション・レベルのエラーをアプリケーション・レベルで修正するには、TPNOTRAN フラグを有効にするか、またはトランザクション外でエラーが返されたサービスにアクセスします。

致命的なトランザクション・エラー

致命的なトランザクション・エラーが発生した場合、アプリケーションでは、イニシエータで tpabort() を呼び出してトランザクションを明示的にアボートしなければなりません。そのため、トランザクションにとって致命的なエラーを認識することが大切です。次の 3 つの場合、トランザクションは失敗します。

トランザクションにとって致命的なプロトコル・エラーが発生するのは、トランザクションの不正なパーティシパントから tpcommit() が呼び出された場合だけです。このエラーは、アプリケーション内で開発段階に修正できます。

イニシエータまたはパーティシパントで障害が発生した後、またはトランザクションがタイムアウトになった後で、tpcommit() が呼び出されると、暗黙的なアボート・エラーになります。その場合、コミットは失敗するので、トランザクションをアボートする必要があります。

通信呼び出しで TPESVCERRTPESVCFAILTPEOTYPE、または TPETIME が返された場合、tpabort() を呼び出してトランザクションを明示的にアボートしなければなりません。トランザクションを明示的にアボートする前に、未処理の呼び出し記述子を待つ必要はありません。ただし、これらの記述子は、呼び出しがアボートされた後は無効と見なされるので、トランザクション終了後にこれらの記述子へのアクセスを試みると、TPEBADDESC が返されます。

TPESVCERRTPESVCFAIL、および TPEOTYPE の場合、トランザクションがタイムアウトにならない限り、引き続き通信呼び出しを行うことができます。これらのエラーが返された場合、トランザクションは「アボートのみ」にマークされます。これ以降の処理の結果を保持するには、flags パラメータに TPNOTRAN を設定して通信用の関数を呼び出します。このフラグを設定すると、「アボートのみ」にマークされたトランザクションで実行された処理は、トランザクションがアボートしてもロールバックされません。

トランザクション・タイムアウトが発生しても通信を続けることはできますが、次のような通信要求を行うことはできません。

そのため、非同期呼び出しを行うには、flags パラメータに TPNOREPLYTPNOBLOCK、または TPNOTRAN を設定する必要があります。

ヒューリスティックな判断に関するエラー

tpcommit() 関数は、TP_COMMIT_CONTROL の設定に応じて、TPEHAZARD または TPEHEURISTIC を返します。

TP_COMMIT_CONTROLTP_CMT_LOGGED を設定すると、2 フェーズ・コミットの第 2 フェーズの実行前にアプリケーションに制御が移ります。その場合、第 2 フェーズ中に発生したヒューリスティックな判断がアプリケーションで認識されないことがあります。

TPEHAZARD または TPEHEURISTIC は 1 フェーズ・コミットで返すことができます。ただし、これが可能なのは、トランザクションに関与しているリソース・マネージャが 1 つだけで、1 フェーズ・コミットでこのリソース・マネージャがヒューリスティックな判断を返すか、なんらかの障害の発生を示す場合です。

TP_COMMIT_CONTROLTP_CMT_COMPLETE を設定すると、リソース・マネージャがヒューリスティックな判断を通知する場合は TPEHEURISTIC が返され、リソース・マネージャがなんらかの障害を通知する場合は TPEHAZARD が返されます。TPEHAZARD は、コミットの第 2 フェーズ (または 1 フェーズ・コミット) でパーティシパントになんらかの障害が発生し、トランザクションが正常終了したかどうかがわからない状況を示します。

 

先頭へ戻る 前のトピックへ 次のトピックへ