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

トランザクション・モードのプロセスが別のプロセスのサービスをリクエストした場合、後者のプロセスは不参加の指示が特にないかぎり、そのトランザクションの参加リソースになります。

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

サービス・サブルーチンがトランザクション・モードかどうかを確認した後で、tpbegin()を呼び出すようにアプリケーションを設計できます

次のいずれかの方法で、トランザクション・レベルを確認できます。

  • サービス・サブルーチンに渡されるサービスのデータ構造体のflagsフィールドに対して問合せを実行します。TPTRANに設定されていると、サービスはトランザクション・モードになっています。
  • tpgetlev(3c)関数を呼び出します。

tpgetlev()関数の呼出しには、次のシグネチャを使用します。

int
tpgetlev() /* Get current transaction level */

tpgetlev()関数に引数は必要ありません。この関数は、呼出し側がトランザクション・モードになっていない場合は0を返し、トランザクション・モードになっている場合は1を返します。

次のリストは、OPEN_ACCTサービスの1つであり、tpgetlev()関数(12行目)を使用してトランザクション・レベルを確認する方法を示しています。プロセスがトランザクション・モードになっていない場合、アプリケーションでトランザクションを開始します(14行目)。tpbegin()が失敗した場合、メッセージがステータス行に戻され(16行目)、tpreturn()rcode引数にグローバル変数tpurcode(5)で取得できるコードが設定されます(1行目と17行目)。

トランザクション・レベルの確認のリスト

001 #define BEGFAIL     3     /* tpurcode setting for return if tpbegin fails */
002 void
003 OPEN_ACCT(transb)

004 TPSVCINFO *transb;

005 {
 ... other declarations ...
006 FBFR *transf;     /* fielded buffer of decoded message */
007 int dotran;      /* checks whether service tpbegin/tpcommit/tpaborts */

008 /* set pointer to TPSVCINFO data buffer */
009 transf = (FBFR *)transb->data;

010 /* Test if transaction exists; initiate if no, check if yes */

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 }
    . . .

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

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

関連項目:

  • 『Oracle Tuxedoアプリケーションの設定』「グローバル・トランザクションの暗黙的な定義」AUTOTRAN構成パラメータ
  • 『Oracle Tuxedoアプリケーションの設定』TRANTIME構成パラメータ。
  • 『Oracle Tuxedoアプリケーションの設定』の「TuxedoをOracle Real Application Clusters (RAC)とともに使用する方法」