グローバル・トランザクションとは、複数のリソース・マネージャを使用し、複数のサーバー上で行われる複数の操作を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構造体のフィールドを示しています
|
|
|
トランザクションがタイムアウトになるまでの時間(秒単位)。この引数に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パラメータに設定した値がシステム・パラメータの値と矛盾しないようにします。
|
|
|
|
TPBEGINは、どのプロセスからも呼び出すことができます。ただし、既にトランザクション・モードになっているプロセスからは呼び出すことはできません。トランザクション・モードで
TPBEGINが呼び出されると、プロトコル・エラーになって呼出しが失敗し、
TP-STATUSに
TPEPROTOが設定されます。プロセスがトランザクション・モードの場合でも、この失敗はトランザクションには影響しません。
次のサンプル・コードは、グローバル・トランザクションの定義方法を簡単に示しています。
. . .
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-STATUSに
TPEABORTが設定されます。
次のサンプル・コードは、トランザクションのタイムアウトを確認する方法を示しています。
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アプリケーションのプログラミング』の 「エラーの管理」を参照してください。
|
次のサンプル・コードは、トランザクションの定義方法を示しています。
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)を呼び出してトランザクションを中断して、すべての操作をロールバックします。
注意:
|
TPCALL、 TPACALL、または TPCONNECTを呼び出すときに明示的に TPNOTRANが設定されている場合、呼び出されたサービスによって実行される操作は、トランザクションに含まれません。つまり、このようなサービスによって実行される操作は、 TPABORTルーチンを呼び出したときにロールバックされません。
|
TPCOMMIT(3cbl)ルーチンは、現在のトランザクションをコミットします。
TPCOMMITから正常に制御が戻ると、現在のトランザクションの結果としてリソースに加えられた変更は永続的なものとなります。
TPCOMMITルーチンの呼出しには、次のシグネチャを使用します。
*
01
TPTRXDEF-REC.
COPY TPTRXDEF.
*
01
TPSTATUS-REC.
COPY TPSTATUS.
*
CALL "TPCOMMIT" USING
TPTRXDEF-REC TPSTATUS-REC.
TPCOMMITを正常に実行するには、次の条件を満たしていることが必要です。
•
|
呼出し側プロセスは、 TPBEGINを呼び出してトランザクションを開始したプロセスと同じでなければなりません。
|
•
|
TPNOTRANフラグを設定しないで呼び出した場合、呼出し側プロセスに未処理のトランザクション応答が存在することはできません。
|
•
|
トランザクションの状態が「ロールバックのみ」ではなく、またタイムアウトになっていないことが必要です。
|
最初の条件を満たしていない場合、呼出しは失敗し、プロトコル・エラーを示す
TPEPROTOが
TP-STATUSに設定されます。2番目または3番目の条件を満たしていない場合、呼出しは失敗し、トランザクションがロールバックされたことを示す
TPEABORTが
TP-STATUSに設定されます。トランザクションに未処理の応答があるときに
TPCOMMITがイニシエータによって呼び出されると、トランザクションは中断され、トランザクションに関連する応答記述子が無効になります。参加リソースが
TPCOMMITまたは
TPABORTを呼び出しても、トランザクションには影響しません。
サービス呼出しで
TPFAILが戻されるか、またはサービス・エラーが発生すると、トランザクションはロールバックのみの状態になります。ロールバックのみのトランザクションに対して
TPCOMMITが呼び出されると、このルーチンはトランザクションを取り消し、-1を戻して
TP-STATUSに
TPEABORTを設定します。すでにタイムアウトになっているトランザクションに対して
TPCOMMITを呼び出した場合も同じ結果になり、
TPCOMMITは-1を戻して
TP-STATUSに
TPEABORTが設定されます。トランザクション・エラーの詳細は、
『C言語を使用したOracle Tuxedo ATMIアプリケーションのプログラミング』の
「エラーの管理」を参照してください。
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-STATUSに
TPEABORTが設定されます。
1つのトランザクションに複数のグループが関係している場合、
TPCOMMITが正常に制御を戻すための条件として、次のいずれかを指定できます。
•
|
すべての参加リソースからコミットの準備が完了したことが通知された場合。つまり、すべての参加リソースが2フェーズ・コミットの第1フェーズが完了したことを報告し、トランザクション・コーディネータのTMSが安定記憶域にコミットの決定を書き込んだ場合です。
|
•
|
すべての参加リソースで2フェーズ・コミットの第2フェーズが完了した場合。
|
この2つの条件のいずれかを指定するには、構成ファイルの
RESOURCESセクションの
CMTRETパラメータに、次のいずれかの値を設定します。
•
|
LOGGED - 第1フェーズの完了が必須であることを示します。
|
•
|
COMPLETE - 第2フェーズの完了が必須であることを示します。
|
デフォルトでは、
CMTRETは
COMPLETEに設定されます。
ほとんどの場合、グローバル・トランザクションのすべての参加リソースが第1フェーズの正常終了を記録した場合、第2フェーズも正常終了します。
CMTRETに
LOGGEDを設定すると、
TCOMMITの呼出しから制御が多少早く戻るようになります。ただし、参加リソースが、コミットの決定と矛盾する方法で、トランザクションの担当部分をヒューリスティックで終了する危険性があります。
このようなリスクを負うべきかどうかの選択は、アプリケーションの性質に左右されます。たとえば、財務アプリケーションなど正確さが要求されるアプリケーションでは、すべての参加リソースが2フェーズ・コミットを完了するまでは、制御を戻さないようにします。時間的な条件を重視するアプリケーションでは、正確さを犠牲にしても実行速度を上げます。
TPABORT(3cbl)ルーチンを使用すると、異常な状態を通知して、明示的にトランザクションを中断できます。この関数は、トランザクションの応答に未処理のものがあると、その呼出し記述子を無効にします。その場合、トランザクションで行われた変更はリソースには適用されません。
TPABORTルーチンの呼出しには、次のシグネチャを使用します。
*
01
TPTRXDEF-REC.
COPY TPTRXDEF.
*
01
TPSTATUS-REC.
COPY TPSTATUS.
*
CALL "TPABORT" USING
TPTRXDEF-REC TPSTATUS-REC.
図9-1は、グローバル・トランザクションを行う階層構造の会話型接続を示しています。
接続階層構造は、次の処理が行われることで構築されます。
1.
|
クライアント(プロセスA)は、 TPBEGINと TPCONNECTを呼び出して、トランザクション・モードで接続を開始します。
|
2.
|
クライアントは、実行する従属サービスを呼び出します。
|
3.
|
各従属サービスは、処理が完了すると、処理が成功したか失敗したか( TPEV_SVCSUCCまたは TPEV_SVCFAIL)を示す応答を階層構造を通じてトランザクションを開始したプロセスに送信します。この例では、トランザクションを開始したプロセスはクライアント(プロセスA)です。従属サービスは、応答の送信が終了すると、つまり未処理の応答がなくなると、 TPRETURNを呼び出します。
|
4.
|
クライアント(プロセスA)は、すべての従属サービスが正常終了したかどうかを確認します。
|
•
|
この場合、クライアントは TPCOMMITを呼び出して、それらのサービスが実行した変更をコミットし、トランザクションを終了します。
|
•
|
正常終了していない従属サービスがある場合、 TPCOMMITは成功しないので、クライアントは TPABORTを呼び出します。
|
次のサンプル・コードでは、クライアントは
REPORTサービスへの同期呼出し(24行目)を行います。次に、通信呼出しで返される可能性があるエラーを調べて(30 - 42行目)、参加リソースの失敗を確認します。
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.
アプリケーションでは、次のいずれかの方法でグローバル・トランザクションを開始できます。
構成ファイルのシステム・パラメータ
AUTOTRANを設定すると、サービス・ルーチンがトランザクション・モードになります。
AUTOTRANに
Yを設定すると、別のプロセスからリクエストを受信したときに、サービス・サブルーチン内でトランザクションが自動的に開始されます。
暗黙的にトランザクションを定義する場合は、以下の規則に従います。
•
|
呼出し側プロセスがトランザクション・モードになっていない場合に、システム・パラメータ AUTOTRANがトランザクションを開始するように設定されていると、プロセスが別のプロセスのサービスをリクエストしたときにトランザクションが開始されます。
|
•
|
すでにトランザクション・モードになっているプロセスが別のプロセスのサービスをリクエストした場合、システムはまず、呼出し側で TPNOTRANが設定されているかどうかを確認します。
|
TPNOTRANが設定されていない場合、呼び出されたプロセスは伝達の規則によってトランザクション・モードになります。システムによって
AUTOTRANパラメータは確認されません。
TPTRN-FLAG IN TPSVCDEF-RECに
TPNOTRANが設定されている場合、呼び出されたプロセスによって実行されるサービスは、現在のトランザクションに含まれません。つまり、「伝達の規則」は適用されません。システムによって
AUTOTRANパラメータが確認されます。
•
|
AUTOTRANに Nが設定されている場合(つまりAUTOTRANが有効になっていない場合)、呼び出されたプロセスはトランザクション・モードになりません。
|
•
|
AUTOTRANに Yが設定されている場合、呼び出されたプロセスはトランザクション・モードになります。ただし、新しいトランザクションとして処理されます。
|
注意:
|
サービスは自動的にトランザクション・モードにできるので、 TPNOTRANフラグが設定されたサービスから、 AUTOTRANパラメータが設定されたサービスを呼び出すことができます。そのようなサービスが別のサービスをリクエストした場合、サービスのデータ構造体のメンバーは問合せに対して TPTRANを返します。たとえば、 TPNOTRAN | TPNOREPLYを設定して呼出しを行い、サービスが呼び出されたときに(そのサービスによって)トランザクションが自動的に開始された場合、データ構造体は、 TPTRAN | TPNOREPLYに設定されます。
|
XA準拠のサーバー・グループに対するグローバル・トランザクションの定義
アプリケーション・プログラマがXA準拠のサーバー・グループのサービスをコーディングする場合、グループのリソース・マネージャを介して操作を行うようにするのが一般的です。通常、サービスは1つのトランザクション内ですべての操作を行います。それに対して、
TPNOTRANの通信設定でサービスを呼び出すと、データベース操作の実行時に予期しない結果を受け取る場合があります。
予測不能な動作を防ぐには、XA準拠のリソース・マネージャに関連付けられているグループのサービスが、常にトランザクション・モードで呼び出されるようにアプリケーションを設計します。または、構成ファイルの
AUTOTRANに
Yを設定します。また、サービス・コードの早い段階で、トランザクション・レベルを確認します。
特定のエラー条件を回避したり正しく解釈するには、プロセスがトランザクション・モードかどうかを確認することが大切です。たとえば、すでにトランザクション・モードになっているプロセスが
TPBEGINを呼び出すとエラーになります。そのようなプロセスが
TPBEGINを呼び出すと、呼出しは失敗し、
TP-STATUSに
TPEPROTOが設定されて、呼出し側がすでにトランザクションに参加しているにもかかわらず呼び出されたことが示されます。トランザクションに影響はありません。
サービス・サブルーチンがトランザクション・モードかどうかを確認した後で、
TPBEGINを呼び出すようにアプリケーションを設計できます。次のいずれかの方法で、トランザクション・レベルを確認できます。
•
|
サービス・ルーチンに渡されるサービスのデータ構造体の設定に対して問合せを実行します。 TPTRANに設定されていると、サービスはトランザクション・モードになります。
|
•
|
TPGETLEV(3cbl)ルーチンを呼び出します。
|
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システム・パラメータを有効にします。
•
|
『Oracle Tuxedoアプリケーションの設定』のTRANTIME構成パラメータ
|