JTA サポート
Java™ Transaction API (JTA) サポートでは、JTA 1.1 仕様で定義される UserTransaction インターフェースに加えて、アプリケーション・プログラミング・インターフェース (API) が提供されます。
- SynchronizationCallback インターフェース
- ExtendedJTATransaction インターフェース
- UOWSynchronizationRegistry インターフェース
- UOWManager インターフェース
- スレッドに関連付けられたグローバル・トランザクション ID およびローカル・トランザクション ID へのアクセス。
グローバル ID は、CosTransactions::PropagationContext: オブジェクトのトランザクション ID と、ローカル Java 仮想マシン (JVM) でトランザクションを一意的に識別するローカル ID を基にしています。
- 任意のエンタープライズ・アプリケーション・コンポーネントが、トランザクション完了でのインタレストを登録するのに使用できる、トランザクション同期化コールバック。
拡張アプリケーションはこのコールバックを使用して、 トランザクションの完了前に更新をフラッシュし、トランザクション完了後に状態を消去することができます。 通常、JavaEE (および関連する) 仕様では、この機能をエンタープライズ・アプリケーション・コンテナーのドメインとして位置付けています。
パーシスタンス・マネージャー、リソース・アダプター、エンタープライズ Bean などのコンポーネント、および Web アプリケーション・コンポーネントは、JTA トランザクションで登録を行うことができます。
以下の情報は、JTA サポートで提供されるインターフェースの概要です。 詳しくは、生成された API の資料を参照してください。
SynchronizationCallback インターフェース
このインターフェースを 実装するオブジェクトは、 まず ExtendedJTATransaction インターフェースを介して得られ、 トランザクションの完了通知を受け取ります。
このインターフェースを実装するオブジェクトは、エンタープライズ・アプリケーション・サーバーの Java プラットフォーム上で実行可能ですが、このオブジェクトが呼び出されたときにアクティブな特定のエンタープライズ・アプリケーション・コンポーネントはありません。 したがって、オブジェクトは、いずれのエンタープライズ・アプリケーション・リソースに対しても、直接アクセスを制限されています。 具体的には、オブジェクトは java (名前空間または任意のコンテナー仲介リソース) にアクセスできません。 そのようなオブジェクトは、そのオブジェクトが代行するエンタープライズ・アプリケーション・コンポーネント (ステートレス・セッション Bean など) への参照をキャッシュに入れることができます。 その後、このオブジェクトは、エンタープライズ・アプリケーション・リソースに通常どおりアクセスできるようになります。 例えば、このオブジェクトを使用して、Java Database Connectivity (JDBC) 接続を獲得し、beforeCompletion メソッドの実行中にデータベースの更新をフラッシュすることができます。
ExtendedJTATransaction インターフェース
このインターフェースは、Java EE JTA サポートへの WebSphere® プログラミング・モデル拡張機能です。 このインターフェースを実装するオブジェクトは、 このインターフェースをサポートする WebSphere Application Server のエンタープライズ・アプリケーション・コンテナーにより java:comp/websphere/ExtendedJTATransaction でバインドされます。 このオブジェクトへのアクセスは、Enterprise JavaBeans (EJB) コンテナーから呼び出された場合、コンポーネント管理トランザクションに制限されません。
ExtendedJTATransaction exJTA = (ExtendedJTATransaction)ctx.lookup("
java:comp/websphere/ExtendedJTATransaction");
SynchronizationCallback sync = new SynchronizationCallback();
exJTA.registerSynchronizationCallback(sync);
- アプリケーション・サーバー上で実行される各トランザクションの終わり (トランザクションがローカルで開始されたか、インポートされたかにかかわらず)。
- コールバックが登録されたトランザクションの終わり。

TransactionSynchronizationRegistry インターフェース
このインターフェースは、JTA 1.1 仕様で定義されます。 システム・レベルのアプリケーション・コンポーネント (パーシスタンス・マネージャー、リソース・アダプター、エンタープライズ Bean など)、および Web アプリケーション・コンポーネントは、このインターフェースを使用して、JTA トランザクションでの登録を行うことができます。そのようにして、例えば、コンポーネントはトランザクションの完了時にキャッシュをフラッシュすることができます。
TransactionSynchronizationRegistry インターフェースを取得するには、java:comp/TransactionSynchronizationRegistry の JNDI 検索を使用します。

UOWSynchronizationRegistry インターフェース
- JTA トランザクション
- ローカル・トランザクション内包 (LTC)
- ActivitySession コンテキスト
- 特殊な順序付けセマンティックで同期オブジェクトを登録します。
- リソース・オブジェクトと UOW を関連付けます。
- 現在の UOW のコンテキストを取得します。
- 現在の UOW 状況を取得します。
- 現在の UOW をロールバックのためにマークします。
UOWSynchronizationRegistry インターフェースを取得するには、java:comp/websphere/UOWSynchronizationRegistry の JNDI 検索を使用します。 このインターフェースは、サーバー環境でのみ使用可能です。
// Retrieve an instance of the UOWSynchronizationRegistry interface from JNDI.
final InitialContext initialContext = new InitialContext();
final UOWSynchronizationRegistry uowSyncRegistry =
(UOWSynchronizationRegistry)initialContext.lookup("java:comp/websphere/UOWSynchronizationRegistry");
// Instantiate a class that implements the javax.transaction.Synchronization interface
final Synchronization sync = new SynchronizationImpl();
// Register the Synchronization object with the current UOW.
uowSynchronizationRegistry.registerInterposedSynchronization(sync);
UOWManager インターフェース
UOWManager インターフェースは、JTA TransactionManager インターフェースと同じく、アプリケーション・サーバーによるトランザクション境界の管理を可能にするメソッドを定義するものです。 アプリケーションは UOWManager インターフェースを使用して、製品内で UOW コンテキストを操作できます。 UOWManager インターフェースは、WebSphere Application Server がサポートする UOW のタイプすべてに適用されます。 そのタイプとは、JTA トランザクション、ローカル・トランザクション内包 (LTC)、および ActivitySession コンテキストです。 アプリケーション・コードを特定のタイプの UOW で実行する際に、適切に構成されたエンタープライズ Bean を使用する必要がありません。 基本的に、UOW の有効範囲内で実行されるロジックは、匿名の内部クラスにカプセル化されます。 システム・レベルのアプリケーション・サーバー・コンポーネント (パーシスタンス・マネージャー、リソース・アダプター、エンタープライズ Bean など)、および Web アプリケーション・コンポーネントは、このインターフェースを使用することができます。
WebSphere Application Server の API またはシステム・プログラミング・インターフェース (SPI) では、TransactionManager インターフェースを提供していません。 UOWManager インターフェースによって同等の機能が提供されていますが、WebSphere Application Server は UOW コンテキストの制御と保全性を保持します。
コンテナー管理環境で UOWManager インターフェースを取得するには、java:comp/websphere/UOWManager の JNDI 検索を使用します。 コンテナー管理環境外で UOWManager インターフェースを取得するには、UOWManagerFactory クラスを使用します。 このインターフェースは、サーバー環境でのみ使用可能です。
UOWManager インターフェースを使用すると、Web アプリケーションをマイグレーションして、エンタープライズ Bean ではなく Web コンポーネントを使用しても、UOW の制御を保持することができます。例えば、現在 UserTransaction インターフェースを使用してグローバル・トランザクションを開始する Web アプリケーションは、一部の非トランザクション作業の実行をサポートしないよう構成されたセッション・エンタープライズ Bean で、メソッドへの呼び出しを行ってから、グローバル・トランザクションを完了します。セッション EJB メソッドでカプセル化されたロジックを、UOWAction 実装の実行メソッドに移動することができます。 その後で、セッション・エンタープライズ Bean を呼び出す Web コンポーネント内のコードを、UOWManager インターフェースの runUnderUOW メソッドへの呼び出しと置き換えて、このロジックがローカル・トランザクションで実行されるように要求します。このようにして、元のアプリケーションと同じレベルで UOW 制御を保持します。
// Retrieve an instance of the UOWManager interface from JNDI.
final InitialContext initialContext = new InitialContext();
final UOWManager uowManager = (UOWManager)initialContext.lookup("java:comp/websphere/UOWManager");
try
{
// Invoke the runUnderUOW method, indicating that the logic should be run in a global
// transaction, and that any existing global transaction should not be joined, that is,
// the work must be performed in the scope of a new global transaction.
uowManager.runUnderUOW(UOWSynchronizationRegistry.UOW_TYPE_GLOBAL_TRANSACTION, false, new UOWAction()
{
public void run() throws Exception
{
// Perform transactional work here.
}
});
}
catch (UOWActionException uowae)
{
// Transactional work resulted in a checked exception being thrown.
}
catch (UOWException uowe)
{
// The completion of the UOW failed unexpectedly. Use the getCause method of the
// UOWException to retrieve the cause of the failure.
}