Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド
目次 索引 前ページ次ページ

第1部 J2EE共通編> 第4章 JNDI

4.12 UserTransactionインタフェースを使用したトランザクション制御

 アプリケーションが、トランザクションを制御する場合、UserTransactionインタフェースを使用して制御します。以下に、UserTransactionインタフェースを使用したトランザクション機能の処理の流れなど、アプリケーションの開発について説明します。

■UserTransactionインタフェースを使用したトランザクション機能の流れ

 以下に、UserTransactionインタフェースを使用したトランザクション機能を使用する場合の処理の流れを示します。

■UserTransactionインタフェースのメソッド

 UserTransactionインタフェースには以下のメソッドがあります。
 使用できるメソッドの一覧を示します。

メソッド名

内容

begin

新しいトランザクションを生成し、現在のスレッドに関連付けます。

commit

現在のスレッドと関連付けられたトランザクションを完了させます。

getStatus

現在のスレッドと関連付けられたトランザクションの状態を獲得します。

rollback

現在のスレッドと関連付けられたトランザクションをロールバックします。

setRollbackOnly

現在のスレッドと関連付けられたトランザクションを、トランザクションの結果がロールバックだけになるように変更します。

setTransactionTimeout

現在のスレッドでbeginメソッドにより開始されたトランザクションと関連するタイムアウト値を変更します。


 UserTransactionインタフェースのsetTransactionTimeoutメソッドは分散トランザクションを使用する場合のみ有効になります。ローカルトランザクションで本メソッドを使用する場合、設定された値は無効になります。

トランザクション制御範囲

 デフォルトのトランザクションを使用する場合、J2EEアプリケーションでトランザクションを開始し、同一Java VM上の他のJ2EEアプリケーションにアクセスする場合、同一のトランザクションで動作させることができます。
 また、WebアプリケーションとEJBアプリケーションを同一JavaVMで運用する場合、WebアプリケーションがUserTrasanctionを使用して、WebアプリケーションからアクセスしたEJBアプリケーション処理をトランザクション連携させることも可能です。

■コネクションの獲得、解放

 コネクションの獲得は、データソースに対してgetConnection()メソッドを発行することによって行います。これ以外の方法で獲得されたコネクションは、トランザクション配下のコネクションとして扱われません。
 コネクションの解放は、獲得したコネクションに対してclose()メソッドを発行することによって行います。
 データソースを使用する場合は、最初にデータソースのlookupを行います。

■記述例

------------------------------------------------------------------------------------
  ...
  javax.transaction.UserTransaction userTransaction = null ;
    /* JNDIのlookupメソッドを使用して、UserTransactionを獲得します */
    try {
        javax.naming.Context initialContext = new
        javax.naming.InitialContext();
        userTransaction =
        (UserTransaction)initialContext.lookup("java:comp/UserTransaction");
    } catch(NamingException ex) {
        /* 例外処理 */
        ...
    }

    /* トランザクション処理を開始します */
    try {
        userTransaction.begin();
    } catch(javax.transaction.NotSupportedException e) {
        /* 例外処理 */
        ...
    } catch(javax.transaction.SystemException e) {
        /* 例外処理 */
        ...
    }

    try {
        /* EJBアプリケーションの呼出し、もしくは、JDBCデータソースへのアクセス */
        ...
    } catch( Throwable e ) {
        /* 例外が発生した場合などはトランザクションをロールバック*/
        userTransaction.rollback();
        throw e;
    }

    try {
        /* 処理を完結したい場合などにはトランザクションをコミット*/
        userTransaction.commit();
    } catch(javax.transaction.HeuristicMixedException e ) {
        /* HeuristicMixedExceptionが発生した場合はコミットもしくはロールバックを実行してください*/
        userTransaction.rollback();
        throw e;
    } catch(java.lang.IllegalStateException e ) {
        userTransaction.rollback();
        throw e;
    } catch(java.lang.SecurityException e ) {
        userTransaction.rollback();
        throw e;
    } catch(javax.transaction.SystemException e ) {
        userTransaction.rollback();
        throw e;
    } catch( Throwable e ) {
        throw e;
    }
  ...
------------------------------------------------------------------------------------


 UserTransactionインタフェースのcommit処理でjavax.transaction.HeuristicMixedExceptionが発生した場合、commitもしくはrollback処理を実行してください。commitもしくはrollback処理を実行しない場合、トランザクションが開始中の状態のまま扱われます。
 また、UserTransactionインタフェースのcommit処理で以下の例外が発生した場合、rollback処理を実行してください。rollback処理を実行しない場合、トランザクションが開始中の状態のまま扱われます。
 UserTransactionオブジェクトを再利用した場合に、トランザクションが開始中の状態のままbegin()メソッドを発行すると、javax.transaction.NotSupportedExceptionが発生する可能性があります。


目次 索引 前ページ次ページ

Copyright 2008 FUJITSU LIMITED