ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server WebLogic Tuxedo Connectorプログラマーズ・ガイド
12c リリース1 (12.1.1)
B65957-01
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

5 Oracle WebLogic Tuxedo Connector JATMIトランザクション

この章では、Java Transaction API (JTA)を使用してOracle WebLogic Tuxedo Connectorグローバル・トランザクションを定義および管理する方法について説明します。

この章の内容は以下のとおりです。

グローバル・トランザクション

グローバル・トランザクションは、2つ以上のリソース・マネージャのある作業、および1つの論理単位として扱われる2つ以上の物理サイトにまたがる作業を実行するトランザクションです。グローバル・トランザクションは常に、次の4つのプロパティによって分類された特定のシーケンスの操作として扱われます。

JTA Transaction API


注意:

詳細は、http://www.oracle.com/technetwork/java/javaee/jta/index.htmlにあるJTA APIを参照してください。

Oracle WebLogic Tuxedo Connectorは、トランザクションの管理にJava Transaction API (JTA)を使用します。

JTAインタフェースのタイプ

JTAには、3つのタイプのトランザクション・インタフェースがあります。

  • Transaction

  • TransactionManager

  • UserTransaction

Transaction

Transactionインタフェースは、ターゲットとなるTransactionオブジェクトのトランザクションに対して実行される操作を許可します。トランザクション・オブジェクトは、作成された各グローバル・トランザクションに対応して作成されます。Transactionインタフェースは、リソースの取得、登録の同期、およびトランザクション完了操作やステータス問合せ操作を実行するために使用します。

TransactionManager

TransactionManagerインタフェースによって、アプリケーション・サーバーはアプリケーションのかわりにトランザクション境界区分のトランザクション・マネージャと通信できるようになります。TransactionManagerインタフェースは、コンテナ管理のEJBコンポーネントのかわりにトランザクション・マネージャと通信するために使用します。

UserTransaction

UserTransactionインタフェースは、TransactionManagerインタフェースのサブセットです。UserTransactionインタフェースは、Transactionオブジェクトへのアクセスを制限する必要があるときに使用します。

JTAトランザクション・プリミティブ

Oracle Tuxedoトランザクション・プリミティブの機能を、等価のJTAトランザクション・プリミティブにマップした表を次に示します。

表5-1 Tuxedoトランザクション・プリミティブとJTAトランザクション・プリミティブのマッピング

Oracle Tuxedo Oracle Tuxedo機能 JTAでは次に相当
tpabort

トランザクションの終了に使用します。

 or rollback
tpcommit

トランザクションの完了に使用します。

commit
tpgetlev

サービス・ルーチンがトランザクション・モードであるかどうかの判断に使用します。

getStatus
tpbegin

トランザクションの開始に使用します。

setTransactionTimeout
begin

トランザクションの定義

トランザクションは、クライアントまたはサーバー・プロセスのいずれかで定義できます。トランザクションは、3つの部分で構成されます。3つの部分とは、開始ポイント、トランザクション・モードのプログラム文、および終了ポイントです。

トランザクションを明示的に定義するには、begin()メソッドを呼び出します。呼出しを行う同じプロセスであるイニシエータは、commit()setRollbackOnly()またはrollback()を呼び出すことによって終了を行うプロセスにもなる必要があります。トランザクション・デリミタ間で呼び出されるサービス・サブルーチンは、現在のトランザクションの一部となります。

トランザクションの開始


注意:

setTransactionTimeout()をあまり大きい値に設定すると、システム検出やエラーのレポートが遅延します。タイムアウト値は、適切な時間内でサービス・リクエストへのレスポンスを行ったり、ネットワーク障害などの問題が発生したトランザクションを終了したりするために使用します。本番環境では、システム・ロードおよびデータベース競合によって起こると予想される遅延に対応するよう、タイムアウト値を調整します。

トランザクションは、begin()の呼出しによって開始されます。タイムアウト値を指定するには、begin()文の前にsetTransactionTimeout(int seconds)文を指定します。

Oracle Tuxedoにトランザクションを伝播するには、次の操作を実行する必要があります。

TPNOTRANの使用

トランザクション・デリミタ内で呼び出されるサービス・ルーチンは、現在のトランザクションの一部となります。ただし、TPNOTRANに設定されたflagsパラメータがtpcall()またはtpacall()に含まれている場合、呼び出されたサービスによって実行される操作は、そのトランザクションの一部にはなりません。結果として、呼び出されたプロセスによって実行されたサービスは、現在のトランザクションの結果からの影響を受けません。

トランザクションの終了

トランザクションは、commit()rollback()、またはsetRollbackOnly()の呼出しによって終了されます。commit()が正常に復帰すると、現在のトランザクションでリソースに対して行われた変更はすべて永続的なものとなります。commit()が正常に実行されるには、次の2つの条件が満たされている必要があります。

  • 呼出しプロセスは、begin()でトランザクションを開始した同じプロセスでなければなりません。

  • 呼出しプロセスに、未処理のトランザクション応答が存在してはなりません。

いずれかの条件がtrueでない場合、この呼出しは失敗し、例外がスローされます。

setRollbackOnly()およびrollback()は、異常が発生したことを示し、すべての記述子を元の状態にロールバックする場合に使用します。

  • トランザクションをロールバックする前に何らかの処理やクリーンアップが必要な場合は、setRollbackOnly()を使用します。

  • トランザクションをロールバックする前に何の処理もクリーンアップも不要な場合は、rollback()を使用します。

Oracle WebLogic Tuxedo Connectorトランザクションのルール

トランザクション・モード中は、トランザクションを正常に完了させるために特定のルールに従う必要があります。トランザクション・モード中に注意すべき基本的なルールは、次のとおりです。

サンプル・トランザクション・コード

次に、トランザクションのサンプル・コードを示します。

例5-1 サンプル・トランザクション・コード

public class TransactionSampleBean implements SessionBean {

.....

public int transaction_sample () {

     int ret = 0;
     try {
          javax.naming.Context myContext = new InitialContext();
          TransactionManager tm = (javax.transaction.TransactionManager)
          myContext.lookup("javax.transaction.TransactionManager");

// Begin Transaction
          tm.begin ();

          TuxedoConnectionFactory tuxConFactory = (TuxedoConnectionFactory) 
          ctxt.lookup("tuxedo.services.TuxedoConnection");

// You could do a local JDBC/XA-database operation here
// which will be part of this transaction.
.....

// NOTE 1: Get the Tuxedo Connection only after 
// you begin the transaction if you want the 
// Tuxedo call to be part of the transaction!

// NOTE 2: If you get the Tuxedo Connection before
// the transaction was started, all calls made from
// that Tuxedo Connection are out of scope of the 
// transaction.

          TuxedoConnection myTux = tuxConFactory.getTuxedoConnection();

// Do a tpcall. This tpcall is part of the transaction.
          TypedString depositData = new TypedString("somecharacters,5000.00");

          Reply depositReply = myTux.tpcall("DEPOSIT", depositData, 0);

// You could also do tpcalls which are not part of 
// transaction (For example, Logging all attempted 
// operations etc.) by setting the TPNOTRAN Flag!
          TypedString logData = 
          new TypedString("DEPOSIT:somecharacters,5000.00");

          Reply logReply = myTux.tpcall("LOGTRAN", logData, 
          ApplicationToMonitorInterface.TPNOTRAN);

// Done with the Tuxedo Connection. Do tpterm.
          myTux.tpterm ();

// Commit Transaction...
          tm.commit ();

// NOTE: The TuxedoConnection object which has been
// used in this transaction, can be used after the
// transaction only if TPNOTRAN flag is set.
}
          catch (NamingException ne) {
          System.out.println ("ERROR: Naming Exception looking up JNDI: " + ne);
          ret = -1;
}
          catch (RollbackException re) {
          System.out.println("ERROR: TRANSACTION ROLLED BACK: " + re);
          ret = 0;
}
          catch (TPException te) {
          System.out.println("ERROR: tpcall failed: TpException: " + te);
          ret = -1;
}
          catch (Exception e) {
          log ("ERROR: Exception: " + e);
          ret = -1;
}

          return ret;
}