|
|
トランザクションが開始されたことの確認
トランザクション・モードのプロセスが別のプロセスのサービスを要求した場合、後者のプロセスは不参加の指示が特にない限り、そのトランザクションのパーティシパントになります。
特定のエラー条件を回避して正しく解釈するには、プロセスがトランザクション・モードかどうかを確認することが大切です。たとえば、既にトランザクション・モードになっているプロセスが tpbegin() を呼び出すとエラーになります。そのようなプロセスが tpbegin()を呼び出すと、呼び出しは失敗し、tperrno(5) にTPEPROTO が設定されて、呼び出し元が既にトランザクションに参加しているにもかかわらず呼び出されたことが示されます。トランザクションに影響はありません。
サービス・サブルーチンがトランザクション・モードかどうかを確認した後で、tpbegin() を呼び出すようにアプリケーションを設計できます。次のいずれかの方法で、トランザクション・レベルを確認できます。
tpgetlev() 関数の呼び出しには、次の文法を使用します。
int
tpgetlev() /* 現在のトランザクション・レベルを取得 */
tpgetlev() 関数に引数は必要ありません。この関数は、呼び出し元がトランザクション・モードになっていない場合は 0 を返し、トランザクション・モードになっている場合は 1 を返します。
次のコード例は、OPEN_ACCT サービスの 1 つであり、tpgetlev() 関数 (12 行目) を使用してトランザクション・レベルを確認する方法を示しています。プロセスがトランザクション・モードになっていない場合、アプリケーションでトランザクションを開始します (14 行目)。tpbegin() が失敗した場合、メッセージがステータス行に返され (16 行目)、tpreturn() の rcode 引数にグローバル変数 tpurcode(5) で取得できるコードが設定されます (1 行目と 17 行目)。
トランザクション・レベルの確認
001 #define BEGFAIL 3 /* tpbegin が失敗した場合に返す tpurcode の値を設定 */
002 void
003 OPEN_ACCT(transb)
004 TPSVCINFO *transb;
005 {
... other declarations ...
006 FBFR *transf; /* 復号化されたメッセージのフィールド化バッファ */
007 int dotran; /* tpbegin、tpcommit、tpaborts のどれであるかを確認 */
008 /* tpsvcinfo データ・バッファへのポインタを設定 */
009 transf = (FBFR *)transb->data;
010 /* トランザクションがあるかどうかを確認し、ない場合は開始、ある場合は確認 */
011 dotran = 0;
012 if (tpgetlev() == 0) {
013 dotran = 1;
014 if (tpbegin(30, 0) == -1) {
015 Fchg(transf, STATLIN, 0,
016 "Attempt to tpbegin within service routine failed\n");
017 tpreturn(TPFAIL, BEGFAIL, transb->data, 0, 0);
018 }
019 }
. . .
AUTOTRAN に Y が設定されている場合、トランザクション関数の tpbegin()、tpcommit()、tpabort() を明示的に呼び出す必要はありません。その結果、トランザクション・レベルを確認するオーバーヘッドを減らすことができます。また、TRANTIME パラメータを設定して、タイムアウト間隔を指定することもできます。タイムアウト間隔は、サービスに対するトランザクションが開始されてからの経過時間です。また、トランザクションが完了しなかった場合は、トランザクションがロールバックされるまでの時間です。
たとえば、前述のコードの OPEN_ACCT サービスを変更するとします。現在のコードでは、OPEN_ACCT にトランザクションが明示的に定義され、そのトランザクションの有無を確認しています (7 行目、10 〜 19 行目)。これらの処理のオーバーヘッドを減らすには、そのコードを削除します。その場合、OPEN_ACCT は常にトランザクション・モードで呼び出す必要があります。この要件を指定するには、コンフィギュレーション・ファイルの AUTOTRAN と TRANTIME システム・パラメータを有効にします。
関連項目
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|