![]() |
![]() |
|
|
トランザクションの終了
グローバル・トランザクションを終了するには、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.
TPTRXDEF-REC 構造体については、「トランザクションの開始」 を参照してください。
トランザクションをコミットするための条件
TPCOMMIT を正常に実行するには、次の条件を満たしていることが必要です。
最初の条件を満たしていない場合、呼び出しは失敗し、プロトコル・エラーを示す TPEPROTO が TP-STATUS に設定されます。2 番目または 3 番目の条件を満たしていない場合、呼び出しは失敗し、トランザクションがロールバックされたことを示す TPEABORT が TP-STATUS に設定されます。トランザクションに未処理の応答があるときに TPCOMMIT がイニシエータによって呼び出されると、トランザクションはアボートされ、トランザクションに関連する応答記述子が無効になります。パーティシパントが TPCOMMIT または TPABORT を呼び出しても、トランザクションには影響しません。
サービス呼び出しで TPFAIL が返されるか、またはサービス・エラーが発生すると、トランザクションは「ロールバックのみ」の状態になります。「ロールバックのみ」のトランザクションに対して TPCOMMIT が呼び出されると、このルーチンはトランザクションを取り消し、-1 を返して TP-STATUS に TPEABORT を設定します。既にタイムアウトになっているトランザクションに対して TPCOMMIT を呼び出した場合も同じ結果になり、これにより、TPCOMMIT は -1 を返し、TP-STATUS に TPEABORT が設定されます。トランザクション・エラーの詳細については、「エラーの管理」を参照してください。
2 フェーズ・コミット・プロトコル
TPCOMMIT ルーチンが呼び出されると、2 フェーズ・コミット・プロトコルによる通信が開始されます。このプロトコルは、その名前が示すように、次の 2 段階の処理に分かれています。
トランザクションのイニシエータが TPCOMMIT ルーチンを呼び出すと、コミット・シーケンスが開始されます。指定されたコーディネータ・グループ内の BEA 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 つの条件のいずれかを指定するには、コンフィギュレーション・ファイルの RESOURCES の CMTRET パラメータに、次のいずれかの値を設定します。
デフォルトでは、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.
TPTRXDEF-REC 構造体の詳細については、「トランザクションの開始」 を参照してください。
例: 会話モードによるトランザクションのコミット
次の図は、グローバル・トランザクションを行う階層構造の会話型接続を示しています。
トランザクション・モードにおける接続階層構造
例: パーティシパントのエラーの確認
次のコード例では、クライアントは 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 * レコードを設定します。
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 * 戻り値を確認します。
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 DIPLAY "REPORT service's reply is not of any known REC-TYPE"
40 *
41 PERFORM DO-TPABORT
42 PERFORM DO-TPTERM.
43 * グローバル・トランザクションをコミットします。
44 DO-TPCOMMIT.
45 CALL "TPCOMMIT" USING TPTRXDEF-REC
46 TPSTATUS-REC
47 IF NOT TPOK
48 error message
49 * トランザクションをアボートします。
50 DO-TPABORT.
51 CALL "TPABORT" USING TPTRXDEF-REC
52 TPSTATUS-REC
53 IF NOT TPOK
54 error message
55 * アプリケーションを分離します。
56 DO-TPTERM.
57 CALL "TPTERM" USING TPSTATUS-REC.
58 IF NOT TPOK
59 error message
60 EXIT PROGRAM.
![]() |
![]() |
![]() |
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|