このトピックでは、Session Bean、サーブレット、またはアプリケーション・クライアント・コンポーネントが、
独自のトランザクションを、コンテナーに管理させるのではなく、
コンポーネント管理トランザクションを使用して直接管理できるようにする方法について説明します。
このタスクについて
注: Entity Bean はトランザクションを管理できません (そのため、
Bean 管理トランザクションを使用できません)。
Session Bean、サーブレット、またはアプリケーション・クライアント・コンポーネントが
コンポーネント管理トランザクションを使用できるようにするには、以下のステップを実行します。
プロシージャー
- Session Bean の場合、デプロイメント記述子のトランザクション属性の設定
で説明しているように、コンポーネントのデプロイメント記述子の「トランザクション・タイプ」属性を
「Bean」に設定します。
- アプリケーション・クライアント・コンポーネントの場合、コンポーネントのデプロイメント記述子の「Allow JTA Demarcation」属性を、デプロイメント記述子のトランザクション属性の設定で説明されているように設定して、トランザクション区分のサポートを使用可能にします。
- アクティブにトランザクションを管理するコンポーネント・コードを作成します。
ステートフル Session Bean の場合、指定されたメソッドで開始したトランザクションは、
そのメソッドの完了前に完了される (つまり、コミットまたはロールバックされる) 必要はありません。
このトランザクションは、例えば、同じメソッドに対する以降の呼び出しの際や、
別のメソッド内でも、後から完了することができます。ただし、通常は同一のメソッド呼び出し内でトランザクションを開始および完了するように
アプリケーションを組み立てることをお勧めします。
その方が、アプリケーションのデバッグおよび保守が単純化されるためです。
以下のコードの抜粋は、
トランザクション・コンテキストをカプセル化するオブジェクトの取得に必要な標準コードを示し、
以下の基本ステップが関係しています。
- "java:comp/UserTransaction" でルックアップを呼び出すことによって、
javax.transaction.UserTransaction オブジェクトを作成します。
- UserTransaction オブジェクトを使用し、必要に応じて begin や commit などのトランザクション・メソッドを使用することによって、トランザクションの境界を定めます。アプリケーション・コンポーネントがトランザクションを開始する場合は、commit メソッドまたは rollback メソッドのいずれかを呼び出して、そのトランザクションを完了することも必要です。
Code example: Getting an object that encapsulates a transaction context
...
import javax.transaction.*;
import javax.naming.InitialContext;
import javax.naming.NamingException;
...
public float doSomething(long arg1)throws NamingException {
InitialContext initCtx = new InitialContext();
UserTransaction userTran = (UserTransaction)initCtx.lookup(
"java:comp/UserTransaction");
...
//Use userTran object to call transaction methods
userTran.begin ();
//Do transactional work
...
userTran.commit ();
...
}
...
}