BEA Logo BEA Tuxedo Release 8.0

  BEA ホーム  |  イベント  |  ソリューション  |  パートナ  |  製品  |  サービス  |  ダウンロード  |  ディベロッパ・センタ  |  WebSUPPORT

 

   Tuxedo ホーム   |   COBOL を使用した BEA Tuxedo アプリケーションのプログラミング   |   先頭へ   |   前へ   |   次へ   |   目次

 


トランザクションの終了

グローバル・トランザクションを終了するには、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 が設定されます。トランザクション・エラーの詳細については、「エラーの管理」を参照してください。

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

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

  1. 参加する各リソース・マネージャがコミットの準備ができたことを示します。

  2. トランザクションのイニシエータが、参加する各リソース・マネージャにコミッ ト許可を与えます。

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

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

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

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

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

この 2 つの条件のいずれかを指定するには、コンフィギュレーション・ファイルの RESOURCESCMTRET パラメータに、次のいずれかの値を設定します。

デフォルトでは、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 構造体の詳細については、「トランザクションの開始」 を参照してください。

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

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

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


 

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

  1. クライアント (プロセス A) は、TPBEGINTPCONNECT を呼び出して、トランザ クション・モードで接続を開始します。

  2. クライアントは、実行する下位サービスを呼び出します。

  3. 各下位サービスは、処理が完了すると、処理が成功したか失敗したか (TPEV_SVCSUCC または TPEV_SVCFAIL) を示す応答を階層構造を通じてトランザ クションを開始したプロセスに送信します。この例では、トランザクションを開 始したプロセスはクライアント (プロセス A) です。下位サービスは、応答の送信 が終了すると、つまり未処理の応答がなくなると、TPRETURN を呼び出します。

  4. クライアント (プロセス A) は、すべての下位サービスが正常終了したかどうかを 確認します。

例: パーティシパントのエラーの確認

次のコード例では、クライアントは 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.

 

先頭へ戻る 前のトピックへ 次のトピックへ