COBOLを使用したOracle Tuxedoアプリケーションのプログラミング

     前  次    新規ウィンドウで目次を開く    PDFとして表示 - 新規ウィンドウ  Adobe Readerを取得 - 新規ウィンドウ
コンテンツはここから始まります

グローバル・トランザクションのコーディング

ここでは、以下の内容について説明します。

 


グローバル・トランザクションとは

グローバル・トランザクションとは、複数のリソース・マネージャを使用し、複数のサーバー上で行われる複数の操作を1つの論理単位として処理できるようにするメカニズムです。

プロセスがトランザクション・モードになると、サーバーにリクエストされたサービスが現在のトランザクションにかわって処理されます。呼び出されてトランザクションに参加したサービスは、「トランザクションの参加リソース」と呼ばれます。 参加リソースから返される値によって、トランザクションの結果が変わる場合があります。

グローバル・トランザクションは複数のローカル・トランザクションから構成され、各トランザクションは同じリソース・マネージャにアクセスします。 リソース・マネージャは、同時実行制御とデータ更新の原子性を実現します。 ローカル・トランザクションでは、アクセスが正常に終了するか、または全体が失敗します。つまり、一部だけが成功することはありません。

1つのトランザクションに参加可能なサーバー・グループは最大16個です。

Oracle Tuxedoシステムでは、グローバル・トランザクションが参加しているリソース・マネージャと共に管理され、原子性、一貫性、独立性、および持続性という特徴を持つ特定シーケンスの操作として処理されます。 つまり、グローバル・トランザクションは、以下のような特徴を持つ論理的な作業単位と言えます。

Oracle Tuxedoシステムでは、個々のグローバル・トランザクションのステータスがトラッキングされ、そのトランザクションをコミットするかロールバックするかが決定されます。

 


トランザクションの開始

グローバル・トランザクションを開始するには、次の文法を使用してTPBEGIN(3cbl)ルーチンを呼び出します。

*
01 TPTRXDEF-REC.
COPY TPTRXDEF.
*
01 TPSTATUS-REC.
COPY TPSTATUS.
*
CALL "TPBEGIN" USING TPTRXDEF-REC TPSTATUS-REC.

表9-1は、TPTRXDEF-RECデータ構造体のフィールドを示しています。

表9-1 TPTRXDEF構造体のフィールド
フィールド
説明
T-OUT
トランザクションがタイムアウトになるまでの時間(秒単位)。 この引数に0を指定すると、システムで可能な最長時間(秒単位)に設定されます。つまり、timeoutには、システムで定義された符号なしlong型の最大値が設定されます。
T-OUTパラメータに0または非現実的な大きな値を指定すると、システムによるエラー検出と報告が遅れる原因となります。T-OUTパラメータを使用すると、サービス・リクエストに対するレスポンスが妥当な時間内に確実に戻されるようになり、ネットワーク障害などの問題が発生した場合に、コミットされる前にトランザクションを終了できます。
レスポンスを人が待っている場合、このパラメータには小さな値(可能な場合は30秒未満)を設定します。
生産システムの場合、T-OUTに大きな値を設定して、システムの負荷やデータベースの競合に起因する遅延に対応できるようにします。予測される平均レスポンス時間を2、3倍した時間が最適です。

注意: T-OUTパラメータに設定する値は、Oracle Tuxedoのアプリケーション管理者が構成ファイルに設定したSCANUNITパラメータの値と一致していなければなりません。SCANUNITパラメータには、タイムアウトになったトランザクションとサービス・リクエストでブロックされた呼出しがないかどうかを確認、つまりスキャンする頻度を指定します。 このパラメータの値は、定期的なスキャンの間隔を表します。

T-OUTパラメータには、スキャンを実行する間隔より大きな値を設定します。T-OUTパラメータに設定された値がスキャンの間隔より小さいと、トランザクションがタイムアウトになる時間と、そのタイムアウトが検出される時間にずれが生じます。SCANUNITのデフォルト値は10秒です。T-OUTパラメータの設定値についてはアプリケーション管理者と検討し、T-OUTパラメータに設定した値がシステム・パラメータの値と矛盾しないようにします。

TRANID
トランザクション識別子。

TPBEGINは、どのプロセスからも呼び出すことができます。ただし、すでにトランザクション・モードになっているプロセスからは呼び出すことはできません。トランザクション・モードでTPBEGINが呼び出されると、プロトコル・エラーになって呼出しが失敗し、TP-STATUSTPEPROTOが設定されます。プロセスがトランザクション・モードの場合でも、この失敗はトランザクションには影響しません。

次のサンプル・コードは、グローバル・トランザクションの定義方法を簡単に示しています。

リスト9-1 トランザクションの定義
. . .
MOVE 0 TO T-OUT.
CALL "TPBEGIN" USING
TPTRXDEF-REC
TPSTATUS-REC.
IF NOT TPOK
    error processing
. . .
    program statements
. . .
CALL "TPCOMMIT" USING
                 TPTRXDEF-REC
                 TPSTATUS-REC.
IF NOT TPOK
    error processing

次のサンプル・コードは、未処理の応答に起因するエラーの発生を示しています。

リスト9-2 エラー - 未処理の応答があるトランザクションの開始
  . . .
  MOVE "BUY" TO SERVICE-NAME.
  SET TPBLOCK TO TRUE.
  SET TPNOTRAN TO TRUE.
  SET TPREPLY TO TRUE.
  SET TPNOTIME TO TRUE.
  SET TPSIGRSTRT TO TRUE.
  CALL "TPACALL" USING
                    TPSVCDEF-REC
                    TPTYPE-REC
                    BUY-REC
                    TPSTATUS-REC.
  IF NOT TPOK
       error processing
  . . .
  MOVE 0 TO T-OUT.
  CALL "TPBEGIN" USING
                    TPTRXDEF-REC
                    TPSTATUS-REC.
vIF NOT TPOK
       error processing
* ERROR TP-STATUS is set to TPEPROTO
  . . .
       program statements
  . . .
  SET TPBLOCK TO TRUE.
  SET TPNOTRAN TO TRUE.
  SET TPCHANGE TO TRUE.
  SET TPNOTIME TO TRUE.
  SET TPSIGRSTRT TO TRUE.
  SET TPGETANY TO TRUE.
  CALL "TPGETRPLY" USING
                    TPSVCDEF-REC
                    TPTYPE-REC
                    WK-AREA
                    TPSTATUS-REC.
  IF NOT TPOK
       error processing

トランザクションがタイムアウトになった場合、TPCOMMITを呼び出すとトランザクションが停止します。その結果、TPCOMMITが失敗し、TP-STATUSTPEABORTが設定されます。

次のサンプル・コードは、トランザクションのタイムアウトを確認する方法を示しています。 T-OUTの値が30秒に設定されていることに注目してください。

リスト9-3 トランザクションのタイムアウトの確認
. . .
MOVE 30 TO T-OUT.
CALL "TPBEGIN" USING TPTRXDEF-REC TPSTATUS-REC.
IF NOT TPOK
     MOVE "Failed to BEGIN a transaction" TO LOG-REC-TEXT.
     MOVE 29 to LOG-REC-LEN
     CALL "USERLOG" USING
                       LOG-REC-TEXT
                       LOG-REC-LEN
                       TPSTATUS-REC
     CALL "TPTERM" USING
                      TPSTATUS-REC
     PERFORM A-999-EXIT.
. . .
         communication CALL statements
. . .
IF TPETIME
     CALL "TPABORT" USING
                       TPTRXDEF-REC
                       TPSTATUS-REC
IF NOT TPOK
         error processing
ELSE
    CALL "TPCOMMIT" USING
                       TPTRXDEF-REC
                       TPSTATUS-REC
    IF NOT TPOK
          error processing
注意: トランザクション・モードのプロセスで、TPNOTRANを設定して通信呼出しを行うと、呼び出されたサービスは現在のトランザクションに参加できません。サービス・リクエストの成功や失敗は、トランザクションの結果に影響しません。トランザクションは、サービスがトランザクションに参加しているかどうかには関係なく、そのサービスから応答が戻されるのを待つ間にタイムアウトになる場合もあります。TPNOTRANフラグの影響の詳細は、『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』「エラーの管理」を参照してください。

次のサンプル・コードは、トランザクションの定義方法を示しています。

リスト9-4 トランザクションの定義
 DATA DIVISION.
WORKING-STORAGE SECTION.
*
01 TPTYPE-REC.
COPY TPTYPE.
*
01 TPSTATUS-REC.
COPY TPSTATUS.
*
01 TPINFDEF-REC.
COPY TPINFDEF.
*
01 TPSVCDEF-REC.
COPY TPSVCDEF.
*
01 TPTRXDEF-REC.
COPY TPTRXDEF.
*
01 LOG-REC PIC X(30) VALUE " ".
01 LOG-REC-LEN PIC S9(9) COMP-5.
*
01 USR-DATA-REC PIC X(16).
*
01 AUDV-REC.
      05 AUDV-BRANCH-ID PIC S9(9) COMP-5.
      05 AUDV-BALANCE PIC S9(9) COMP-5.
      05 AUDV-ERRMSG PIC X(60).
*
  PROCEDURE DIVISION.
*
A-000.
. . .
* Get Command Line Options set Variables (Q-BRANCH)
  MOVE SPACES TO USRNAME.
  MOVE SPACES TO CLTNAME.
  MOVE SPACES TO PASSWD.
  MOVE SPACES TO GRPNAME.
  CALL "TPINITIALIZE" USING TPINFDEF-REC
                          USR-DATA-REC
                          TPSTATUS-REC.
  IF NOT TPOK
       MOVE "Failed to join application" TO LOG-REC
       MOVE 26 TO LOG-REC-LEN
        CALL "USERLOG" USING LOG-REC
                          LOG-REC-LEN
                          TPSTATUS-REC
        PERFORM A-999-EXIT.
* Start global transaction
  MOVE 30 TO T-OUT.
  CALL "TPBEGIN" USING TPTRXDEF-REC TPSTATUS-REC.
  IF NOT TPOK
       MOVE 29 to LOG-REC-LEN
       MOVE "Failed to begin a transaction" TO LOG-REC
       CALL "USERLOG" USING LOG-REC
                         LOG-REC-LEN
                         TPSTATUS-REC
       PERFORM DO-TPTERM.
* Set up record
  MOVE Q-BRANCH TO AUDV-BRANCH-ID.
  MOVE ZEROS TO AUDV-BALANCE.
  MOVE SPACES TO AUDV-ERRMSG.
* Set up TPCALL records
  MOVE "GETBALANCE" TO SERVICE-NAME.
  MOVE "VIEW" TO REC-TYPE.
  MOVE LENGTH OF AUDV-REC TO LEN.
  SET TPBLOCK TO TRUE.
  SET TPTRAN IN TPSVCDEF-REC TO TRUE.
  SET TPNOTIME TO TRUE.
  SET TPSIGRSTRT TO TRUE.
  SET TPCHANGE TO TRUE.
*
  CALL "TPCALL" USING TPSVCDEF-REC
                   TPTYPE-REC
                   AUDV-REC
                   TPTYPE-REC
                   AUDV-REC
                   TPSTATUS-REC.
  IF NOT TPOK
       MOVE 19 to LOG-REC-LEN
       MOVE "Service call failed" TO LOG-REC
       CALL "USERLOG" USING LOG-REC
                         LOG-REC-LEN
                         TPSTATUS-REC
       PERFORM DO-TPABORT
       PERFORM DO-TPTERM.
* Commit global transaction
  CALL "TPCOMMIT" USING TPTRXDEF-REC
                  TPSTATUS-REC
  IF NOT TPOK
       MOVE 16 to LOG-REC-LEN
       MOVE "Failed to commit" TO LOG-REC
       CALL "USERLOG" USING LOG-REC
                   LOG-REC-LEN
                   TPSTATUS-REC
  PERFORM DO-TPTERM.
* Show results only when transaction has completed successfully
  DISPLAY "BRANCH=" Q-BRANCH.
  DISPLAY "BALANCE=" AUDV-BALANCE.
  PERFORM DO-TPTERM.
* Abort the transaction
DO-TPABORT.
  CALL "TPABORT" USING TPTRXDEF-REC
                       TPSTATUS-REC
  IF NOT TPOK
       MOVE 26 to LOG-REC-LEN
       MOVE "Failed to abort transaction" TO LOG-REC
       CALL "USERLOG" USING LOG-REC
                         LOG-REC-LEN
                         TPSTATUS-REC.
* Leave the application
DO-TPTERM.
  CALL "TPTERM" USING TPSTATUS-REC.
  IF NOT TPOK
       MOVE 27 to LOG-REC-LEN
       MOVE "Failed to leave application" TO LOG-REC
       CALL "USERLOG" USING LOG-REC
                         LOG-REC-LEN
                         TPSTATUS-REC.
                         EXIT PROGRAM.
*
A-999-EXIT.
*
EXIT PROGRAM.

 


トランザクションの終了

グローバル・トランザクションを終了するには、TPCOMMIT(3cbl)を呼び出して現在のトランザクションをコミットするか、またはTPABORT(3cbl)を呼び出して処理を停止して、すべての操作をロールバックします。

注意: TPCALLTPACALL、またはTPCONNECTを呼び出すときに明示的にTPNOTRANが設定されている場合、呼び出されたサービスによって実行される操作は、トランザクションに含まれません。 つまり、このようなサービスによって実行される操作は、TPABORTルーチンを呼び出したときにロールバックされません。

現在のトランザクションのコミット

TPCOMMIT(3cbl)ルーチンは、現在のトランザクションをコミットします。 TPCOMMITから正常に制御が戻ると、現在のトランザクションの結果としてリソースに加えられた変更は永続的なものとなります。

TPCOMMITルーチンの呼出しには、次の文法を使用します。

*
01 TPTRXDEF-REC.
COPY TPTRXDEF.
*
01 TPSTATUS-REC.
COPY TPSTATUS.
*
CALL "TPCOMMIT" USING TPTRXDEF-REC TPSTATUS-REC.

TPTRXDEF-REC構造体については、「トランザクションの開始」を参照してください。

トランザクションをコミットするための条件

TPCOMMITを正常に実行するには、次の条件を満たしていることが必要です。

最初の条件を満たしていない場合、呼出しは失敗し、プロトコル・エラーを示すTPEPROTOTP-STATUSに設定されます。2番目または3番目の条件を満たしていない場合、呼出しは失敗し、トランザクションがロールバックされたことを示すTPEABORTTP-STATUSに設定されます。トランザクションに未処理の応答があるときにTPCOMMITが開始プロセスによって呼び出されると、トランザクションは停止され、トランザクションに関連する応答記述子が無効になります。参加リソースがTPCOMMITまたはTPABORTを呼び出しても、トランザクションには影響しません。

サービス呼出しでTPFAILが戻されるか、またはサービス・エラーが発生すると、トランザクションはロールバックのみの状態になります。ロールバックのみのトランザクションに対してTPCOMMITが呼び出されると、このルーチンはトランザクションを取り消し、-1を戻してTP-STATUSTPEABORTを設定します。すでにタイムアウトになっているトランザクションに対してTPCOMMITを呼び出した場合も同じ結果になり、TPCOMMITは-1を戻してTP-STATUSTPEABORTが設定されます。トランザクション・エラーの詳細は、『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』「エラーの管理」を参照してください。

2フェーズ・コミット・プロトコル

TPCOMMITルーチンが呼び出されると、2フェーズ・コミット・プロトコルによる通信が開始されます。 このプロトコルは、その名前が示すように、次の2段階の処理に分かれています。

  1. 参加する各リソース・マネージャがコミットの準備ができたことを示します。
  2. トランザクションの開始プロセスが、参加する各リソース・マネージャにコミット許可を与えます。

トランザクションの開始プロセスがTPCOMMITルーチンを呼び出すと、コミット・シーケンスが開始されます。指定されたコーディネータ・グループ内のOracle Tuxedo TMSサーバー・プロセスは、コミット・プロトコルの最初のフェーズを実行する各参加リソース・グループのTMSと通信を行います。次に、各グループのTMSは、そのグループのリソース・マネージャ(RM)に、トランザクション・マネージャとRM間の通信用に定義されているXAプロトコルを使用してコミットするように指示します。RMは、安定記憶域にコミット・シーケンスの前後のトランザクションの状態を書き込み、TMSに成功か失敗かを通知します。その後、TMSはトランザクション・コーディネータのTMSにレスポンスを渡します。

トランザクション・コーディネータのTMSは、すべてのグループから成功の通知を受け取ると、トランザクションのコミット中であることをログに記録し、第2フェーズのコミット通知をすべての参加リソース・グループに送信します。 その後、各グループのRMはトランザクションの更新を完了します。

トランザクション・コーディネータのTMSが、グループから第1フェーズのコミットの失敗の通知を受けた場合、またはグループからの応答の受信に失敗した場合、各RMにロールバック通知を送信し、RMはすべてのトランザクション更新を以前の状態に戻します。 これにより、TPCOMMITは失敗し、TP-STATUSTPEABORTが設定されます。

コミットの成功条件の選択

1つのトランザクションに複数のグループが関係している場合、TPCOMMITが正常に制御を戻すための条件として、次のいずれかを指定できます。

この2つの条件のいずれかを指定するには、構成ファイルのRESOURCESセクションのCMTRETパラメータに、次のいずれかの値を設定します。

デフォルトでは、CMTRETCOMPLETEに設定されます。

コミット条件での妥協点

ほとんどの場合、グローバル・トランザクションのすべての参加リソースが第1フェーズの正常終了を記録した場合、第2フェーズも正常終了します。CMTRETLOGGEDを設定すると、TCOMMITの呼出しから制御が多少早く戻るようになります。ただし、参加リソースが、コミットの決定と矛盾する方法で、トランザクションの担当部分をヒューリスティックで終了する危険性があります。

このようなリスクを負うべきかどうかの選択は、アプリケーションの性質に左右されます。 たとえば、財務アプリケーションなど正確さが要求されるアプリケーションでは、すべての参加リソースが2フェーズ・コミットを完了するまでは、制御を戻さないようにします。 時間的な条件を重視するアプリケーションでは、正確さを犠牲にしても実行速度を上げます。

現在のトランザクションの停止

TPABORT(3cbl)ルーチンを使用すると、異常な状態を通知して、明示的にトランザクションを停止できます。この関数は、トランザクションの応答に未処理のものがあると、その呼出し記述子を無効にします。その場合、トランザクションで行われた変更はリソースには適用されません。TPABORTルーチンの呼出しには、次の文法を使用します。

*
01 TPTRXDEF-REC.
COPY TPTRXDEF.
*
01 TPSTATUS-REC.
COPY TPSTATUS.
*
CALL "TPABORT" USING TPTRXDEF-REC TPSTATUS-REC.

TPTRXDEF-REC構造体については、「トランザクションの開始」を参照してください。

例:会話モードによるトランザクションのコミット

図9-1は、グローバル・トランザクションを行う階層構造の会話型接続を示しています。

図9-1トランザクション・モードにおける接続階層構造

接続階層構造は、次の処理が行われることで構築されます。

  1. クライアント(プロセスA)は、TPBEGINTPCONNECTを呼び出して、トランザクション・モードで接続を開始します。
  2. クライアントは、実行する従属サービスを呼び出します。
  3. 各従属サービスは、処理が完了すると、処理が成功したか失敗したか(TPEV_SVCSUCCまたはTPEV_SVCFAIL)を示す応答を階層構造を通じてトランザクションを開始したプロセスに送信します。 この例では、トランザクションを開始したプロセスはクライアント(プロセスA)です。 従属サービスは、応答の送信が終了すると、つまり未処理の応答がなくなると、TPRETURNを呼び出します。
  4. クライアント(プロセスA)は、すべての従属サービスが正常終了したかどうかを確認します。
    • この場合、クライアントはTPCOMMITを呼び出して、それらのサービスが実行した変更をコミットし、トランザクションを終了します。
    • 正常終了していない従属サービスがある場合、TPCOMMITは成功しないので、クライアントはTPABORTを呼び出します。

例:参加リソースのエラーの確認

次のサンプル・コードでは、クライアントはREPORTサービスへの同期呼出し(24行目)を行います。 次に、通信呼出しで返される可能性があるエラーを調べて(30 - 42行目)、参加リソースの失敗を確認します。

リスト9-5 パーティシパントの成功/失敗の確認
01   . . .
02 CALL "TPINITIALIZE" USING TPINFDEF-REC
03 USR-DATA-REC
04 TPSTATUS-REC.
05 IF NOT TPOK
06 error message,
07 EXIT PROGRAM .
08 MOVE 30 TO T-OUT.
09 CALL "TPBEGIN" USING TPTRXDEF-REC TPSTATUS-REC.
10 IF NOT TPOK
11 error message,
12 PERFORM DO-TPTERM.
13 * Set up record
14 MOVE "REPORT=accrcv DBNAME=accounts" TP-RECORD.
15 MOVE 27 TO LEN.
16 MOVE "REPORTS" TO SERVICE-NAME.
17 MOVE "STRING" TO REC-TYPE.
18 SET TPBLOCK TO TRUE.
19 SET TPTRAN IN TPSVCDEF-REC TO TRUE.
20 SET TPNOTIME TO TRUE.
21 SET TPSIGRSTRT TO TRUE.
22 SET TPCHANGE TO TRUE.
23 *
24 CALL "TPCALL" USING TPSVCDEF-REC
25 TPTYPE-REC
26 TP-RECORD
27 TPTYPE-REC
28 TP-RECORD
29 TPSTATUS-REC.
30 IF TPOK
31 PERFORM DO-TPCOMMIT
32 PERFORM DO-TPTERM.
33 * Check return status
34 IF TPESVCERR
35 DISPLAY "REPORT service's TPRETURN encountered problems"
36 ELSE IF TPESVCFAIL
37 DISPLAY "REPORT service FAILED with return code=" APPL-RETURN-CODE
38 ELSE IF TPEOTYPE
39 DISPLAY "REPORT service's reply is not of any known REC-TYPE"
40 *
41 PERFORM DO-TPABORT
42 PERFORM DO-TPTERM.
43 * Commit global transaction
44 DO-TPCOMMIT.
45 CALL "TPCOMMIT" USING TPTRXDEF-REC
46 TPSTATUS-REC
47 IF NOT TPOK
48 error message
49 * Abort the transaction
50 DO-TPABORT.
51 CALL "TPABORT" USING TPTRXDEF-REC
52 TPSTATUS-REC
53 IF NOT TPOK
54 error message
55 * Leave the application
56 DO-TPTERM.
57 CALL "TPTERM" USING TPSTATUS-REC.
58 IF NOT TPOK
59 error message
60 EXIT PROGRAM.

 


グローバル・トランザクションの暗黙的な定義

アプリケーションでは、次のいずれかの方法でグローバル・トランザクションを開始できます。

この項では、2番目の方法について説明します。

構成ファイルのシステム・パラメータAUTOTRANを設定すると、サービス・ルーチンがトランザクション・モードになります。AUTOTRANYを設定すると、別のプロセスからリクエストを受信したときに、サービス・サブルーチン内でトランザクションが自動的に開始されます。

暗黙的にトランザクションを定義する場合は、以下の規則に従います。

注意: サービスは自動的にトランザクション・モードにできるので、TPNOTRANフラグが設定されたサービスから、AUTOTRANパラメータが設定されたサービスを呼び出すことができます。そのようなサービスが別のサービスをリクエストした場合、サービスのデータ構造体のメンバーは問合せに対してTPTRANを返します。たとえば、TPNOTRAN | TPNOREPLYを設定して呼出しを行い、サービスが呼び出されたときに(そのサービスによって)トランザクションが自動的に開始された場合、データ構造体は、TPTRAN | TPNOREPLYに設定されます。

 


XA準拠のサーバー・グループに対するグローバル・トランザクションの定義

アプリケーション・プログラマがXA準拠のサーバー・グループのサービスをコーディングする場合、グループのリソース・マネージャを介して操作を行うようにするのが一般的です。通常、サービスは1つのトランザクション内ですべての操作を行います。それに対して、TPNOTRANの通信設定でサービスを呼び出すと、データベース操作の実行時に予期しない結果を受け取る場合があります。

予測不能な動作を防ぐには、XA準拠のリソース・マネージャに対応付けられているグループのサービスが、常にトランザクション・モードで呼び出されるようにアプリケーションを設計します。または、構成ファイルのAUTOTRANYを設定します。 また、サービス・コードの早い段階で、トランザクション・レベルを確認します。

 


トランザクションが開始されたことの確認

特定のエラー条件を回避したり正しく解釈するには、プロセスがトランザクション・モードかどうかを確認することが大切です。たとえば、すでにトランザクション・モードになっているプロセスがTPBEGINを呼び出すとエラーになります。そのようなプロセスがTPBEGINを呼び出すと、呼出しは失敗し、TP-STATUSTPEPROTOが設定されて、呼出し側がすでにトランザクションに参加しているにもかかわらず呼び出されたことが示されます。トランザクションに影響はありません。

サービス・サブルーチンがトランザクション・モードかどうかを確認した後で、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行目)、TPRETURNAPPL-CODE IN TPSVCRET-RECAPL-RETURN-CODE IN TPSTATUS-RECで取得できるコードが設定されます(1行目と11行目)。

リスト9-6 トランザクション・レベルの確認
     . . . 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.
     . . .

AUTOTRANYが設定されている場合、トランザクション・ルーチンのTPBEGINTPCOMMITTPABORTを明示的に呼び出す必要はありません。 その結果、トランザクション・レベルを確認するオーバーヘッドを減らすことができます。 また、TRANTIMEパラメータを設定して、タイムアウト間隔を指定することもできます。タイムアウト間隔は、サービスに対するトランザクションが開始されてからの経過時間です。また、トランザクションが完了しなかった場合は、トランザクションがロールバックされるまでの時間です。

たとえば、前述のコードのOPEN_ACCTサービスを変更するとします。 現在のコードでは、OPEN_ACCTにトランザクションが明示的に定義され、そのトランザクションの有無を確認しています。 これらの処理のオーバーヘッドを減らすには、そのコードを削除します。 その場合、OPEN_ACCTは常にトランザクション・モードで呼び出す必要があります。 この要件を指定するには、構成ファイルのAUTOTRANTRANTIMEシステム・パラメータを有効にします。

関連項目


  先頭に戻る       前  次