Oracle Tuxedoシステムでは、TP-STATUS IN TPSTATUS-REC
を使用して、ルーチンが失敗した場合にプロセスに情報が渡されます。すべてのATMI呼出しは、TP-STATUS
にエラーの内容を示す値を設定します。サービス・ルーチンを終了させるために使用するTPRETURN
やTPFORWAR
など、呼出し側に戻らない関数の場合、成功か失敗かを確認する唯一の方法はリクエスタのTP-STATUS
変数です。
APPL-RETURN-CODE
は、ユーザー定義の条件だけを通知します。APPL-RETURN-CODE
には、TPRETURN
時にAPPL-CODE IN TPSVCRET-REC
の値が設定されます。TPRETURN
エラーまたはトランザクション・タイムアウトが発生しないかぎり、APPL-RETURN-CODE IN TPSTATUS-REC
の値に関係なく、APPL-RETURN-CODE
に値が設定されます。
TP-STATUS
に戻されるコードは、エラーの種類を表し、表11-1は、そのエラーの種類を示しています。
プロトコル1
|
|
TPETRAN2
|
|
1 2このエラーの詳細は、「致命的なトランザクション・エラー」を参照してください。 |
脚注1にあるように、TP-STATUS
によって通知される4種類のエラーは、すべてのATMI関数で発生するエラーです。 それ以外のエラーの種類は、特定のATMI呼び出しだけで発生します。以下に、一部のエラーの種類について詳しく説明します。
停止の原因となるエラーについては、「致命的なトランザクション・エラー」を参照してください。
Oracle Tuxedoのシステム・エラーは、問題がアプリケーション・レベルではなくシステム・レベルで発生していることを示します。 Oracle Tuxedoのシステム・エラーが発生すると、エラーの原因を示すメッセージが中央イベント・ログに書き込まれ、TP-STATUS
にTPESYSTEM
が返されます。詳細は、「中央イベント・ログ」を参照してください。これらのエラーは、アプリケーションではなくシステムで発生するので、エラーの修正についてはシステム管理者に問い合せてください。
通信ハンドルのエラーは、通信ハンドルの数が上限値を超えている場合、または無効な値を参照している場合に発生します。 非同期呼び出しや会話型呼出しでは、未処理の通信ハンドルの数が上限値を超えると、TPELIMIT
が返されます。 操作に対して無効な通信ハンドルの値が指定されている場合は、TPEBADDESC
が返されます。
通信ハンドルのエラーが発生するのは、非同期呼び出しまたは会話型呼出しを行った場合だけです。同期呼出しでは、呼出し記述子は使用されません。非同期呼出しでは、通信ハンドルを使用して対応するリクエストに応答が対応付けられます。会話型送受信用のルーチンは、通信ハンドルを使用して接続を識別します。つまり、接続を開始する呼出しでは、通信ハンドルを使用できることが大切です。
通信ハンドルのエラーのトラブルシューティングは、アプリケーション・レベルで特定のエラーを調べて行います。
システムでは、コンテキスト(またはOracle Tuxedoアプリケーションへの対応付け)ごとに未処理の通信ハンドル(応答)を50個まで使用できます。 この上限値はシステムで定義されているので、アプリケーションで再定義することはできません。
会話型接続を同時に行う場合の通信ハンドルに関する制限は、応答時の制限ほど厳しくありません。上限値は、アプリケーション管理者が構成ファイルに定義します。アプリケーションが実行中ではない場合、管理者は構成ファイルのRESOURCES
セクションのMAXCONV
パラメータを変更できます。アプリケーションが実行中の場合も、MACHINES
セクションは動的に変更できます。詳細は、『Oracle Tuxedoコマンド・リファレンス』の「tmconfig、wtmconfig(1)」を参照してください。
通信ハンドルは無効になることがあります。無効な通信ハンドルが参照されると、次の場合にTP-STATUS
にエラーが返されます。
会話型サービスで不明なハンドルが指定されると、TPSEND
、TPRECV
、およびTPDISCON
ルーチンはTPEBADDESC
を返します。
会話型接続の確立後にTPSEND
とTPRECV
がTPEEVENT
エラーで失敗した場合、イベントが発生します。 TPSEND
でデータを送信できるかどうかは、発生したイベントによって決まります。 システムは、TPSTATUS-REC
のTPEVENT
メンバーのTPEEVENT
を返します。行われる処理は、発生したイベントによって異なります。
会話型イベントの詳細は、『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の「会話型通信イベント」を参照してください。
処理の結果として複製オブジェクトが生成されるような操作が試みられると、TP-STATUS
にTPEMATCH
エラー・コードが返されます。 次の表は、TPEMATCH
エラー・コードを返すルーチンとその原因を示しています。
これらのルーチンの詳細は、『Oracle Tuxedo ATMI COBOL関数リファレンス』を参照してください。
一般的な通信呼出しのエラーは、呼出しが同期または非同期で行われたかどうかに関係なく、どのような通信呼出しでも発生する可能性があります。 TP-STATUS
には、TPESVCFAIL
、TPESVCERR
、TPEBLOCK
、またはTPGOTSIG
が返されます。
TPCALL
またはTPGETRPLY
を呼び出した結果、通信の応答部分が失敗すると、TP-STATUS
にTPESVCERR
またはTPSEVCFAIL
が返されます。 TPRETURN
に渡された引数でエラーが判別され、この呼出しで実行する処理が決定されます。
引数の処理中にTPRETURN
でエラーが発生すると、システムはエラーを元のリクエスタに返し、TP-STATUS
にTPESVCERR
を設定します。受信側では、TP-STATUS
の値を調べてエラーの発生を確認します。システムでは、TPRETURN
呼出しからのデータ送信は行われず、TPGETRPLY
でエラーが発生した場合は、呼出しハンドルが無効なものとみなされます。
TPRETURN
でTPESVCERR
エラーが発生していない場合、TP-RETURN-VAL
に返された値で呼出しが成功したか失敗したかを判断できます。 アプリケーションで、TP-RETURN-VAL
にTPFAIL
が指定されると、システムはTP-STATUS
にTPESVCFAIL
を返し、呼出し側にデータ・メッセージを送信します。 TP-RETURN-VAL
にTPSUCCESS
が設定されると、呼出し側に制御が正常に戻り、TP-STATUS
は設定されず、呼出し側がデータを受信します。
TPEBLOCK
およびTPGOTSIG
エラー・コードは、メッセージのリクエスト側に返される場合も応答側に返される場合もあるので、すべての通信呼出しに対して返される可能性があります。
ブロッキング状態が発生している場合に、リクエストを同期または非同期に送信するプロセスでブロッキング状態を無視するようにTPPNOBLOCK
が設定されていると、システムはTPEBLOCK
を返します。たとえば、システムのキューがすべていっぱいになっている場合、リクエストが送信されるとブロッキング状態になります。
TPCALL
がブロッキング状態を示していない場合は、通信の送信部分だけに影響します。リクエストの送信に成功すると、その呼出しが応答を待っている間にブロッキング状態が存在したとしても、TPEBLOCK
は返されません。
TPNOBLOCK
を設定して呼出しを行った場合、TPGETRPLY
が応答を待っている間にブロッキング状態が発生すると、TPGETRPLY
にTPEBLOCK
が返されます。 この状況は、メッセージがその時点で使用できない場合などに発生します。
TPGOTSIG
エラーは、シグナルによってシステム・コールに割込みが発生したことを示します。このような状況は、実際にはエラーではありません。 TPSIGRSTRT
が設定されていると、呼出しは失敗せず、TP-STATUS
にTPGOTSIG
エラー・コードが返されます。
無効な引数によるエラーは、ルーチンに渡された引数が無効であることを示しています。引数を取るATMI呼出しは、無効な引数が渡されると失敗します。呼出し側に制御が戻る呼出しの場合、関数は失敗して、TP-STATUS
にTPEINVAL
が設定されます。TPRETURN
またはTPFORWAR
の場合、リクエストを開始して結果を待っているTPCALL
またはTPGETRPLY
に対して、TP-STATUS
にTPESVCERR
が設定されます。
ルーチンに有効な引数だけを渡すようにすると、無効な引数によるアプリケーション・レベルでのエラーを修正できます。
レコード・タイプを識別するためのデータ構造体やシステム表にエントリがないと、エラーが発生します。エントリ・タイプのエラーを示すTPENOENT
の意味は、そのエラーを戻す呼出しによって異なります。表11-2は、このエラーを戻す呼出しとエラーの様々な原因を示しています。
オペレーティング・システムのエラーは、オペレーティング・システム・コールが失敗したことを示します。 TP-STATUS
にTPEOS
が返されます。 UNIXシステムの場合、失敗したシステム・コールを識別する整数値がグローバル変数Uunixerr
に返されます。 オペレーティング・システム・エラーを修正するには、システム管理者に問い合せてください。
呼出し側プロセスに、アプリケーションに参加するために必要なパーミッションが設定されていない場合、TPINITIALIZE
呼出しは失敗して、TP-STATUS
にTPEPERM
が返されます。 パーミッションは、構成ファイルに設定されるもので、アプリケーションには設定されません。 このエラーが発生した場合は、アプリケーション管理者に問い合せて、必要なパーミッションが構成ファイルに設定されていることを確認してください。
ATMI呼出しが間違った順序で行われた場合、または間違ったプロセスを使用して行われた場合、プロトコル・エラーが発生します。 たとえば、アプリケーションに参加する前に、クライアントがサーバーとの通信の開始を試みると、このエラーが発生します。 また、開始プロセスではなくトランザクションの参加リソースによってTPCOMMIT
が呼び出された場合も、このエラーが発生します。
ATMI呼出しを正しい順序で正しく使用すると、アプリケーション・レベルでプロトコル・エラーを修正できます。
プロトコル・エラーの原因を特定するには、次の事柄を確認してください。
プロトコル・エラーでは、TP-STATUS
にTPEPROTO
値が返されます。
詳細は、『Oracle Tuxedo ATMI COBOL関数リファレンス』のCOBOLアプリケーション・トランザクション・モニター・インタフェースの概要に関する項を参照してください。
特定のキューへの登録またはキューからの取出しに失敗した場合、TPENQUEUE(3cbl)またはTPDEQUEUE(3cbl)ルーチンはTP-STATUS
にTPEDIAGNOSTIC
を戻します。処理が失敗した原因は、ctl
レコードを介して戻される診断値によって判別できます。有効なctl
フラグのリストは、『Oracle Tuxedo ATMI COBOL関数リファレンス』の「TPENQUEUE(3cbl)」または「TPDEQUEUE(3cbl)」を参照してください。
アプリケーション・ドメインに参加するOracle Tuxedoシステムのリリース間で互換性に問題がある場合、Oracle TuxedoシステムはTP-STATUS
にTPERELEASE
を返します。
たとえば、TPNOTIFY(3cbl)ルーチンを呼び出す際に、呼出し側がターゲット・クライアントから承認メッセージを受け取るまでブロックすることを示すTPACK
フラグが設定されている場合、ターゲット・クライアントがTPACK
承認プロトコルがサポートされていない旧バージョンのOracle Tuxedoシステムを使用していると、TPERELEASE
エラーが返されます。
リソース・マネージャ・エラーは、TPOPEN(3cbl)およびTPCLOSE(3cbl)を呼び出したときに発生し、TP-STATUS
にTPERMERR
の値が戻されます。リソース・マネージャを正しくオープンできなかった場合、TPOPEN
でこのエラー・コードが戻されます。同じように、リソース・マネージャを正しくクローズできなかった場合は、TPCLOSE
でこのエラー・コードが戻されます。Oracle Tuxedoシステムでは、移植性を保つために、この種類のエラーでは詳細な情報は戻されません。リソース・マネージャ・エラーの正確な内容を判断するには、リソース・マネージャに問い合せる必要があります。
Oracle Tuxedoシステムでは、タイムアウト・エラーがサポートされており、アプリケーションがサービス・リクエストまたはトランザクションを待つ時間に制限があります。Oracle Tuxedoシステムでサポートされている設定可能なタイムアウト機構は、ブロッキング・タイムアウトとトランザクション・タイムアウトの2種類です。
ブロッキング・タイムアウトは、アプリケーションがサービス・リクエストに対する応答を待つ時間の上限値を指定します。 アプリケーション管理者は、構成ファイルにシステムのブロッキング・タイムアウトを設定します。
トランザクション・タイムアウトは、トランザクション(サービス・リクエストが行われる場合もあり)の有効期間を定義します。 アプリケーションのトランザクション・タイムアウトを定義するには、TPBEGIN
にT-OUT
引数を渡します。
通信呼出しでは、ブロッキング・タイムアウトまたはトランザクション・タイムアウトのいずれかが返され、TPCOMMIT
ではトランザクション・タイムアウトだけが返されます。 いずれの場合も、トランザクション・モードのプロセスで呼出しが失敗してTPETIME
が返された場合は、トランザクション・タイムアウトが発生しています。
デフォルトでは、プロセスがトランザクション・モードではない場合、ブロッキング・タイムアウトが実行されます。
プロセスがトランザクション・モードではない場合に、非同期呼出しでブロッキング・タイムアウトが発生すると、ブロックされている通信呼出しは失敗します。ただし、呼出し記述子は有効なままであり、再度呼出しを行う場合に使用できます。 ほかの通信には影響ありません。
トランザクション・タイムアウトが発生すると、非同期トランザクション応答の通信ハンドル(TPNOTRAN
フラグが指定されていないもの)は無効になり、参照できなくなります。
呼出しがトランザクション・モードで行われていない場合、またはTPNOBLOCK
が設定されていない場合、TPETIME
は通信呼出しでブロッキング・タイムアウトが発生したことを示します。
注意: | TPNOBLOCK が設定されている場合、ブロッキング状態が存在すると呼出しは直ちに戻るので、ブロッキング・タイムアウトは発生しません。 |
タイムアウト・エラーの処理の詳細は、「トランザクションについて」を参照してください。
トランザクション、および致命的なエラーと致命的ではないエラーについては、「トランザクションについて」を参照してください。
プロセスに対するリクエストまたは応答が不明なタイプのレコードで送信された場合、型付きレコードのエラーが返されます。リクエスト・データ・レコードの送信先のサービスでレコード・タイプが認識されない場合、TPCALL
およびTPACALL
呼出しはTPEITYPE
を返します。
プロセスで認識されるレコード・タイプは、構成ファイルとプロセスにリンクされているOracle Tuxedoシステム・ライブラリの両方で識別されるものです。これらのライブラリは、プロセスで認識される型付きレコードを識別するデータ構造体を定義および初期化します。プロセスごとにライブラリを作成するか、またはレコード・タイプが定義されたアプリケーション固有のファイルのコピーをアプリケーションで用意することができます。アプリケーションでは、レコード・タイプ・スイッチと呼ばれるレコード・タイプ・データ構造体をプロセスごとに設定できます。詳細は、『ファイル形式、データ記述、MIBおよびシステム・プロセス・リファレンス』の「tuxtypes(5)」および「typesw(5)」を参照してください。
呼出し側で認識されないか、または使用できないレコードで応答メッセージが送信されると、TPCALL
およびTPGETRPLY
呼出しはTPEOTYPE
を返します。呼出し側で使用できないレコードの場合、そのレコード・タイプはタイプ・スイッチに含まれています。ただし、返されたタイプは応答の受信用に割り当てられたレコードと一致せず、また呼出し側は異なるレコード・タイプを使用することはできません。呼出し側は、TPNOCHANGE
を設定して、このような状況を示します。その場合、厳密なタイプ・チェックが行われ、違反が見つかるとTPEOTYPE
が返されます。デフォルトでは、緩やかなタイプ・チェックが行われます。その場合、呼出し側で認識されるかぎり、最初に割り当てられたタイプ以外のレコード・タイプが返されることもあります。応答の送信では、応答レコードは呼出し側で認識できるものでなければなりません。また、厳密なタイプ・チェックが指定されている場合は、それに従う必要があります。
アプリケーション内では、TPRETURN
のrcode
引数を使用して、呼出し側のプログラムにユーザー定義のエラーに関する情報を渡すことができます。また、APPL-RETURN-CODE
には、TPRETURN
時にAPPL-CODE IN TPSVCRET-REC
の値が設定されます。TPRETURN(3cbl)の詳細は、『Oracle Tuxedo ATMI COBOL関数リファレンス』を参照してください。
アプリケーションのロジックは、戻り値がある呼出しのエラー条件を調べ、エラー発生時に適切な処理を行うように設計します。
次のサンプル・コードは、エラーの一般的な処理方法を示しています。 この例では、ATMICALL(3)
は、一般的なATMI呼出しを表しています。
. . .
CALL "TPINITIALIZE" USING TPINFDEF-REC
USR-DATA-REC
TPSTATUS-REC.
IF NOT TPOK
error message, EXIT PROGRAM
CALL "TPBEGIN" USING TPTRXDEF-REC
TPSTATUS-REC.
IF NOT TPOK
error message, EXIT PROGRAM
Make atmi calls
Check return values
IF TPEINVAL
DISPLAY "Invalid arguments were given."
IF TPEPROTO
DISPLAY "A call was made in an improper context."
. . .
Include all error cases described in the ATMICALL(3)
reference page. Other return codes are not possible,
so there is no need to test them.
. . .
continue
TP-STATUS
の値は、各問題の詳細を示し、どのレベルで問題の解決が可能かを示しています。 アプリケーションで、ある処理に特定のエラー条件が定義されている場合、APPL-RETURN-CODE IN TPSTATUS-REC
の値にも同じことが言えます。
以下の項では、各種のプログラミング機能がトランザクション・モードでどのように動作するかについて説明します。まず、トランザクション・モードのコーディングで従うべき基本的な通信規則について説明します。
トランザクション・モードで実行するコードを記述する場合は、以下の基本的な通信規則に従います。
TPACALL
にTPNOTRAN
またはTPNOREPLY
を設定します。TPRETURN
またはTPFORWAR
を呼び出す前に、すべての非同期トランザクション応答を取得する必要があります。 この規則には、コードをトランザクション・モードで実行するかどうかに関係なく従います。TPCOMMIT
を呼び出す前に、すべての非同期トランザクション応答(TPNOTRAN
が指定されていないもの)を取得する必要があります。TPACALL
で行ったリクエストに対する応答を取得する必要があります。TPNOTRAN
を設定して、トランザクションがロールバックされた後でも通信の結果が保持されるようにします。TPGETRPLY
の呼出しでは、呼出しのローカル状態を表す値が戻され、ローカル条件を反映する成功コードまたはエラー・コードのいずれかが戻されます。TPGETRPLY
で一度ハンドルを使用した場合、またはエラー条件を通知するためにTPSEND
またはTPRECV
で一度ハンドルを使用した場合、そのハンドルは無効になり、以降このハンドルを参照するとTPEBADDESC
が返されます。 この規則には、コードをトランザクション・モードで実行するかどうかに関係なく従います。TPNOTRAN
フラグが設定されていないもの)はすべて無効になり、以降このハンドルを参照するとTPEBADDESC
が返されます。
以下の項では、トランザクションに関連するエラーについて説明します。
トランザクション・エラーが発生すると、TP-STATUS
にTPETRAN
が戻されますが、このようなエラーの意味は、そのエラーを戻す呼出しによって異なります。表11-3は、トランザクション・エラーを戻す呼出しと、考えられるエラーの原因を示しています。
致命的なトランザクション・エラーが発生した場合、アプリケーションでは、開始プロセスで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フェーズ・コミット)で参加リソースになんらかの障害が発生し、トランザクションが正常終了したかどうかがわからない状況を示します。
「トランザクション・エラー」で説明したように、Oracle Tuxedoアプリケーションでは、ブロッキング・タイムアウトとトランザクション・タイムアウトの2種類のタイムアウトが発生します。以下の項では、各種のプログラミング機能へのトランザクション・タイムアウトの影響について説明します。タイムアウトの詳細は、「トランザクション・エラー」を参照してください。
TPCOMMIT
を呼び出した後でタイムアウトが発生した場合、トランザクションはどのような状態になるでしょうか。トランザクションがタイムアウトになり、そのトランザクションが停止されたことがシステムで認識されると、システムはTP-STATUS
にTPEABORT
を設定して、そのようなイベントの発生を通知します。トランザクションのステータスが不明な場合は、エラー・コードにTPETIME
を設定します。
トランザクションの状態が明確ではない場合、リソース・マネージャに問い合せる必要があります。まず、トランザクションによって行われた変更が適用されたかどうかを確認します。これにより、トランザクションがコミットされたか、または停止されたかを判断できます。
トランザクション・モードのプロセスで、TPNOTRAN
を設定して通信呼出しを行うと、呼び出されたサービスは現在のトランザクションに参加できません。サービス・リクエストの成功や失敗は、トランザクションの結果に影響しません。トランザクションは、サービスから応答が返されるのを待つ間にタイムアウトになる場合もあります。これは、そのサービスがトランザクションに参加しているかどうかには関係ありません。
TPNOTRAN
の使用方法の詳細は、「TPRETURNおよびTPFORWAR呼出し」を参照してください。
トランザクション・モードで実行中にプロセスを呼び出すと、TPRETURN
およびTPFORWAR
は、トランザクションのサービス部分をそのトランザクションの完了時にコミットまたは停止できる状態にします。同じトランザクションでサービスを何度も呼び出すことができます。システムは、トランザクションの開始プロセスによってTPCOMMIT
またはTPABORT
が呼び出されないかぎり、トランザクションを完全にはコミットまたは停止しません。
サービス内で行われた通信呼出しのすべての未処理のハンドルが取得されるまで、TPRETURN
またはTPFORWAR
を呼び出すことはできません。TP-RETURN-VAL
にTPSUCCESS
を設定して、未処理のハンドルでTPRETURN
を呼び出すと、プロトコル・エラーが発生し、TPGETRPLY
を待機中のプロセスにTPESVCERR
が戻されます。そのプロセスがトランザクション・モードになっている場合、呼出し側は「中断のみ」にマークされます。トランザクションの開始プロセスがTPCOMMIT
を呼び出した場合も、トランザクションが暗黙的に中断されます。TP-RETURN-VAL
にTPFAIL
を設定して、未処理のハンドルでTPRETURN
を呼び出すと、TPGETRPLY
を待機中のプロセスにTPESVCFAIL
が戻されます。トランザクションへの影響は同じです。
トランザクション・モードで実行中にTPRETURN
を呼び出すと、TPRETURNで発生したプロセス・エラー、またはアプリケーションによってTP-RETURN-VAL
に設定された値で示されるエラーにより、トランザクションの結果に影響することがあります。
TPFORWAR
を使用すると、ある時点まではリクエストが正しく処理されていることを示すことができます。アプリケーション・エラーが検出されない場合、システムはTPFORWAR
を呼び出します。アプリケーション・エラーが検出された場合、システムはTPFAIL
を設定してTPRETURN
を呼び出します。TPFORWAR
を正しく呼び出さないと、システムはその呼出しをプロセス・エラーとみなし、エラー・メッセージをリクエスタに返します。
TPTERM
呼出しは、アプリケーションからクライアント・コンテキストを削除します。
クライアント・コンテキストがトランザクション・モードになっている場合、呼出しは失敗して、TP-STATUS
にTPEPROTO
が返されます。クライアント・コンテキストは、トランザクション・モードでアプリケーションの一部として残ります。
呼出しが成功すると、現在の実行スレッドはアプリケーション内に存在しなくなるため、クライアント・コンテキストは、トランザクションと通信したりトランザクションに参加できなくなります。
ATMI呼出しを使用してトランザクションを定義すると、Oracle Tuxedoシステムによって内部呼出しが実行され、トランザクションに参加している各リソース・マネージャにグローバル・トランザクション情報が渡されます。TPCOMMIT
やTPABORT
など呼び出すと、各リソース・マネージャに対して内部呼出しが行われ、呼出し側のグローバル・トランザクションのために行われていた作業がコミットまたは中断されます。
グローバル・トランザクションが開始された場合(明示的でも暗黙的でも)、アプリケーション・コードでリソース・マネージャのトランザクション呼出しを明示的に実行することはできません。このトランザクション規則に従わないと、不安定な結果が生じます。TPGETLEV
呼出しを使用すると、リソース・マネージャのトランザクション呼出しを実行する前に、グローバル・トランザクション内にすでにプロセスがあるかどうかを確認できます。
リソース・マネージャによっては、トランザクションの整合性レベルなど、特定のパラメータをプログラマが設定できるものがあります。その場合、リソース・マネージャ間のインタフェースで使用可能なオプションを指定します。 そのようなオプションは、次の2つの方法で使用できるようになります。
詳細は、リソース・マネージャのドキュメントを参照してください。
オプションの設定方法はリソース・マネージャによって異なります。たとえば、Oracle TuxedoシステムのSQLリソース・マネージャの場合、set transaction
文を使用して、Oracle Tuxedoシステムによってすでに開始されているトランザクションに対する特定のオプション(整合性レベルとアクセス・モード)が決まります。
トランザクション・モードになっている呼出し側が、現在のトランザクションに参加するために別のサービスを呼び出した場合、次のようになります。
TPRETURN
とTPFORWAR
は、トランザクションに参加しているサービスから呼び出されると、そのトランザクションのサービス部分を開始プロセスによって中断またはコミットできる状態にします。TPNOREPLY
を使用することはできません。 TPNOTRAN
を設定して通信呼出しを行い、呼び出されたときにトランザクションが自動的に開始するようにサービスが設定されている場合、呼出し側プロセスと呼び出されたプロセスはどちらもトランザクション・モードになります。ただし、この2つは別々のトランザクションを構成します。 この状況では、次の処理が行われます。
TPRETURN
は、トランザクションの開始プロセスの役割を果たし、トランザクションが自動的に開始されたサービスでトランザクションを終了します。または、TPFORWAR
によって終了するサービスでトランザクションが自動的に開始された場合、転送チェーンの最後のサービスで発行されたTPRETURN
呼出しが、トランザクションの開始プロセスの役割を果たし、トランザクションを終了します(例については、「AUTOTRANが設定されたTPFORWARとTPRETURNのトランザクションでの役割」を参照)。TPRETURN
はトランザクション・モードなので、トランザクションの参加リソースの障害やトランザクション・タイムアウトなどの影響を受けます。 その場合、エラー・メッセージが返されます。 TPNOTRAN
を設定して通信呼出しを行い、呼び出されたサービスが自動的にトランザクション・モードにならないように設定されている場合、TPBEGIN
、TPCOMMIT
、およびTPABORT
を明示的に呼び出すと、サービスで複数のトランザクションを定義できます。 その結果、TPRETURN
が呼び出される前にトランザクションを完了できます。
TPRETURN
はトランザクションの役割は果たしません。つまり、サービス・ルーチンにトランザクションが明示的に定義されているかどうかにかかわらず、TPRETURN
の役割は常に同じです。TPRETURN
はTP-RETURN-VAL
に任意の値を返します。TPESVCFAIL
、TPEITYPE
/TPEOTYPE
、およびTPESVCERR
の一般的な規則に従います。
Oracle Tuxedoシステムで提供されるサブルーチンTPSVRINIT
およびTPSVRDONE
は、トランザクションで使用される場合は特定の規則に従う必要があります。
Oracle Tuxedoシステム・サーバーは、初期化時にTPSVRINIT
を呼び出します。特に、TPSVRINIT
は、呼出し側プロセスがサーバーになった後、サービス・リクエストの処理を開始する前に呼び出されます。TPSVRINIT
で非同期通信を実行した場合、関数が戻る前にすべての応答が取得されなければなりません。この処理が行われなかった場合、システムは保留中の応答があっても無視して、サーバーを終了します。TPSVRINIT
でトランザクションを定義した場合、関数が戻る前にすべての非同期応答を取得して、トランザクションを終了しなければなりません。この処理が行われなかった場合、システムは未処理の応答が残っていてもトランザクションを停止し、それらの応答をすべて無視します。その場合、サーバーは正常に終了します。
Oracle Tuxedoシステム・サーバーの抽象化では、サービス・リクエストの処理が完了した後、終了する前にTPSVRDONE
を呼び出します。この時点で、サーバーのサービスの通知は取り消されますが、サーバー自体はアプリケーションから分離していません。TPSVRDONE
で通信を開始した場合、この関数は未処理の応答をすべて取得してから戻る必要がありますが、この処理が行われなかった場合、システムは保留中の応答があっても無視して、サーバーを終了します。TPSVRDONE
内でトランザクションを開始した場合は、未処理のすべての応答を取得してから終了する必要がありますが、この処理が行われなかった場合、システムはトランザクションを中断し、応答を無視します。この場合もサーバーは終了します。
中央イベント・ログには、Oracle Tuxedoアプリケーションで発生する重要なイベントが記録されます。これらのイベントに関するメッセージは、アプリケーション・クライアントとサービスがUSERLOG(3cbl)ルーチンを介してログに送信されます。
中央イベント・ログの分析は、アプリケーションで行う必要があります。 USERLOG(3cbl)に記録するイベントに関しては、厳密なガイドラインを定義しておきます。 ほとんど問題にならないようなメッセージを記録しないようにすると、アプリケーションのデバッグが簡単になります。
Windows 2003プラットフォームの中央イベント・ログの設定の詳細は、『WindowsでのOracle Tuxedo ATMIの使用』を参照してください。
アプリケーション管理者は、構成ファイルに、各マシン上のエラー・メッセージ・ファイル名の接頭辞として使用する絶対パス名を定義します。 USERLOG(3cbl)ルーチンは、月、日、年を表すmmddyy
の形式で日付を生成し、この日付をパス名の接頭辞に付加して中央イベント・ログの完全なファイル名を構成します。 毎日、新しいファイルが作成されます。 そのため、中央イベント・ログに数日間にわたってメッセージが送信された場合、メッセージはそれぞれ異なるファイルに書き込まれます。
hhmmss
)。uname
(1)コマンドから返される名前が使用されます。 たとえば、mach1
(uname
コマンドから返される名前)というUNIXマシン上で、セキュリティ・プログラムが午後4:22:14
に次のような呼出しを行ったとします。
01 LOG-REC PIC X(15) VALUE "UNKNOWN USER ".
01 LOGREC-LEN PIC S9(9) VALUES IS 13.
CALL "USERLOG" USING LOG-REC LOGREC-LEN TPSTATUS-REC.
162214.mach1!security.23451: UNKNOWN USER
前述のメッセージが、アプリケーションではなくOracle Tuxedoシステムによって生成された場合は、次のようになります。
162214.mach1!security.23451: COBAPI_CAT: 999: UNKNOWN USER
この例では、メッセージのカタログ名はCOBAPI_CAT
、メッセージ番号は999
です。
プロセスがトランザクション・モードのときにメッセージが中央イベント・ログに送られると、ユーザー・ログ・エントリのタグにはそのほかの要素が付加されます。 これらの要素は、リテラル文字列のgtrid
と、それに続く3桁のlong型の16進数で構成されます。 これらの整数はグローバル・トランザクションをユニークに識別するもので、グローバル・トランザクション識別子、つまりgtrid
と呼ばれます。 この識別子は主に管理上の目的で使用されます。また、中央イベント・ログでメッセージの前に付加されるタグの中に挿入されます。 システムがトランザクション・モードで中央イベント・ログにメッセージを書き込むと、ログ・エントリは次のようになります。
162214.mach1!security.23451: gtrid x2 x24e1b803 x239:
UNKNOWN USER
イベント・ログにメッセージを書き込むには、次の手順に従います。
01 TPSTATUS-REC.
COPY TPSTATUS.
01 LOGMSG PIC X(50).
01 LOGMSG-LEN PIC S9(9) COMP-5.
. . .
CALL "TPOPEN" USING TPSTSTUS-REC.
IF NOT TPOK
MOVE "TPSVRINIT: Cannot Open Data Base" TO LOGMSG
MOVE 43 LOGMSG-LEN
CALL "USERLOG" USING LOGMSG
LOGMSG-LEN
TPSTATUS-REC.
. . .
この例では、TPOPEN(3cbl)が-1
を返した場合、メッセージが中央イベント・ログに送られます。