![]() |
![]() |
|
|
トランザクションが開始されたことの確認
特定のエラー条件を回避したり正しく解釈するには、プロセスがトランザクション・モードかどうかを確認することが大切です。たとえば、既にトランザクション・モードになっているプロセスが TPBEGIN を呼び出すとエラーになります。そのようなプロセスが TPBEGIN を呼び出すと、呼び出しは失敗し、TP-STATUS に TPEPROTO が設定されて、呼び出し元が既にトランザクションに参加しているにもかかわらず呼び出されたことが示されます。トランザクションに影響はありません。
サービス・サブルーチンがトランザクション・モードかどうかを確認した後で、TPBEGIN を呼び出すようにアプリケーションを設計できます。次のいずれかの方法で、トランザクション・レベルを確認できます。
TPGETLEV ルーチンの呼び出しには、次の文法を使用します。
01 TPTRXLEV-REC.
COPY TPTRXLEV.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPGETLEV" USING TPTRXLEV-REC TPSTATUS-REC.
TPGETLEV は、呼び出し元がトランザクション・モードになっていない場合は TP-NOT-IN-TRAN を返し、トランザクション・モードになっている場合は TP-IN-TRAN を返します。
次のコード例は、TPGETLEV ルーチン (3 行目) を使用して、トランザクション・レベルを確認する方法を示しています。プロセスがトランザクション・モードになっていない場合、アプリケーションでトランザクションを開始します (5 行目)。TPBEGIN が失敗した場合、メッセージがステータス行に返され (9 行目)、TPRETURN の APPL-CODE IN TPSVCRET-REC に APL-RETURN-CODE IN TPSTATUS-REC で取得できるコードが設定されます (1 行目と 11 行目)。
トランザクション・レベルの確認
. . . Application defined codes
001 77 BEG-FAILED PIC S9(9) VALUE 3.
. . .
002 PROCEDURE DIVISION.
. . .
003 CALL "TPGETLEV" USING TPTRCLEV-REC
TPSTATUS-REC.
004 IF NOT TPOK
error processing EXIT PROGRAM
005 IF TP-NOT-IN-TRAN
006 MOVE 30 TO T-OUT.
007 CALL "TPBEGIN" USING
TPTRXDEF-REC
TPSTATUS-REC.
008 IF NOT TPOK
009 MOVE "Attempt to TPBEGIN within service failed"
TO USER-MESSAGE.
010 SET TPFAIL TO TRUE.
011 MOVE BEG-FAILED TO APPL-CODE.
012 COPY TPRETURN REPLACING
013 DATA-REC BY USER-MESSAGE.
. . .
AUTOTRAN に Y が設定されている場合、トランザクション・ルーチンの TPBEGIN、TPCOMMIT、TPABORT を明示的に呼び出す必要はありません。その結果、トランザクション・レベルを確認するオーバーヘッドを減らすことができます。また、TRANTIME パラメータを設定して、タイムアウト間隔を指定することもできます。タイムアウト間隔は、サービスに対するトランザクションが開始されてからの経過時間です。また、トランザクションが完了しなかった場合は、トランザクションがロールバックされるまでの時間です。
たとえば、前述のコードの OPEN_ACCT サービスを変更するとします。現在のコードでは、OPEN_ACCT にトランザクションが明示的に定義され、そのトランザクションの有無を確認しています。これらの処理のオーバーヘッドを減らすには、そのコードを削除します。その場合、OPEN_ACCT は常にトランザクション・モードで呼び出す必要があります。この要件を指定するには、コンフィギュレーション・ファイルの AUTOTRAN と TRANTIME システム・パラメータを有効にします。
関連項目
![]() |
![]() |
![]() |
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|