Javaを紐解くための重点キーワード

伊藤敬
日本BEAシステムズ
2001/11/7


JTA/JTS


JTA/JTSとは?

 JTA/JTS(Java Transaction API、Java Transaction Service)はJ2EEアーキテクチャにトランザクション処理サービスを提供します。

 JTAには、トランザクション・マネージャがトランザクション処理を行う際に、トランザクションに関与する各種コンポーネントとの間で必要となるAPIが定義されています(ここでいうコンポーネントとは、トランザクション処理を要求するアプリケーション群、J2EEアプリケーションサーバ、RDBMSなどのリソース・マネージャを指します)。トランザクション・マネージャは、アプリケーションから要求されるトランザクション処理をリソース・マネージャとともに実行し、かつシステムからのあらゆる影響を遮断して確実にトランザクション処理を実行するソフトウェア・サービスです。2001年11月現在のJTAの最新仕様はバージョン1.0.1です。

 JTSには、JTAをサポートするトランザクション・マネージャの実装が指定されており、JTSへの準拠にはObject Management Group Object Transaction Service 1.1仕様のJavaマッピングが実装されることになります。JTSトランザクション・マネージャは、J2EE分散アプリケーションでトランザクション処理を実現するために必要な基本機能を提供することができます。JTSに定義されているトランザクション・マネージャの機能は、トランザクション境界設定、トランザクションリソースの管理、同期化、および特定のトランザクションインスタンスへの固有情報の伝播に必要なサービスおよび管理機能などです。現在の最新仕様はJTS 1.0(ドラフト仕様)です。JTA/JTSと関連するサービスなどの概要を下図に示します。

JTA/JTSとそれに関連するサービス。網かけ部分がJTAのインターフェイス

 JTAとJTSはJ2EE準拠のアプリケーションサーバにとって必ずしも両方の実装が必須ではありません。J2EE仕様には、JTAは必須と記載されていますが、JTSについては実装の1つの選択とあります。

JTSで定義されるトランザクション・マネージャ

 トランザクション・マネージャは、トランザクションの開始と完了を行うアプリケーションプログラムからのコマンドを、それらのトランザクションにかかわるすべてのリソース・マネージャと通信することで調整します。リソース・マネージャがトランザクション中に失敗した場合、トランザクション・マネージャはリソース・マネージャが保留中のトランザクションをコミットするかロールバックするかを決定するのを支援します。JTSでは以下のようにトランザクション・マネージャの機能が定義されています。

  • アプリケーションおよびアプリケーションサーバにトランザクションのスコープと存続期間の操作性を提供する
  • シングルトランザクションに対して複数のアプリケーションやコンポーネントの包含を可能にする
  • グローバルトランザクションをサポートするリソース・マネージャとの連携
  • 複数のリソース・マネージャとの通信を伴うグローバルトランザクションの実行と完了
  • トランザクション同期のサポート
  • ほかのトランザクション・マネージャとの連携

 J2EE SDKではJTSに基づくトランザクション・マネージャの実装が提供されており、これを利用してJ2EEアプリケーションの分散トランザクションを動作させてみることができます。

JTAトランザクション

 JTAは主に3つの要素で構成されています。

  1. アプリケーションからトランザクションの境界設定やトランザクション管理を実行するためのインターフェイスであるjavax.transaction.UserTransaction。このインターフェイスは、Webアプリケーションや Bean管理のトランザクションを持つEJBで使用する
  2. トランザクション・マネージャがアプリケーションのトランザクションの境界設定や、トランザクションの管理を行うためのインターフェイスであるjavax.transaction.TransactionManager。このインターフェイスはコンテナ管理のトランザクションを持つEJBのEJBコンテナによって使用される
  3. トランザクション・マネージャがXA準拠リソースのリソース・マネージャと連携するためのインターフェイスであるjavax.transaction.xa.XAResource

 JTAトランザクションは、複数のコンポーネントやリソース・マネージャ間にまたがることのできるトランザクションです。そのため、分散アプリケーションとして、非常に柔軟かつ複雑なトランザクション処理を開発できます。しかし、本来トランザクションが持つべきACID属性をシステムとして確実に実現するためには、極力アプリケーションサーバにトランザクション処理を任せた方が無難です。そのためにアプリケーションサーバは自動的にトランザクション処理を実行できるよう、属性をEJBにセットするだけでJTAトランザクションを操作できるしくみ――コンテナ管理によるトランザクション境界の設定――を提供しています。これはEJBの利用価値としても大きな意味を持っています。

 また、JTAトランザクションをプログラミングによって利用するには、JTAのjavax.transaction.UserTransactionインターフェイスを使用します。

EJBでのトランザクション

 EJBには、Bean管理によるものとコンテナ管理によるものの、2種類のトランザクション境界設定があります。コンテナ管理によるトランザクション境界設定では、6つのトランザクション属性(Required、RequiresNew、NotSupported、Supports、Mandatory、およびNever)をEJBのメソッドに関連付けることができます。

コンテナ管理によるトランザクション境界設定

 コンテナ管理によるトランザクション境界設定を使うEJBの場合、EJBコンテナがトランザクション境界を管理します。EJBが実行される際、メソッドのトランザクション属性によって、どのようなトランザクション管理をEJBコンテナで行う必要があるかがコントロールされます。例えば、メソッドのトランザクション属性がRequiresNewの場合、EJBコンテナは、このメソッドが呼ばれるたびに新しいJTAトランザクションを開始し、メソッドが戻る前にトランザクションをコミットしようとします。

 コンテナ管理によるトランザクション境界設定を使用することには、次のような利点があります。

  • EJBのトランザクション動作は、プログラムではなく、宣言によって指定されます。これにより、アプリケーションコンポーネントプロバイダは、トランザクション境界設定コードをコンポーネント内に作成する必要がなくなり、コンポーネントとしての独立性を高めることができる
  • トランザクション境界設定をEJBコンテナに任せるので信頼性を向上できる
  • EJBを再利用する場合に、用途に応じてトランザクション属性を変更し活用することができる

Bean管理によるトランザクション境界設定

 Bean管理によるトランザクション境界設定では、EJBはJTAのjavax.transaction.UserTransactionインターフェイスを使用して、トランザクション境界を明示的に設定します。Bean管理によるトランザクション境界設定を選択できるのは、セッションBeanだけです。エンティティBeanは、常にコンテナ管理によるトランザクション境界設定を使用する必要があります。

 以下のコードは、Bean管理によるトランザクション境界設定を使ってトランザクションを境界設定するJTAインターフェイスの使用法を示しています。UserTransactionオブジェクトはメソッド EJBContext.getUserTransactionを使用してルックアップされ、トランザクションで使用されます。

UserTransaction ut = ejbContext.getUserTransaction();
ut.begin();
// perform transactional work here
ut.commit();

Webアプリケーションのトランザクション

 Webアプリケーション(JSP、Servlet)は、EJBのようなJTAの緊密な連携は持っていません。このため、Webアプリケーションでは、JNDIを使ってUserTransactionオブジェクトをルックアップしてから、UserTransactionインターフェイスを使ってトランザクションを境界設定します。これは、WebコンポーネントがJTAトランザクションの範囲内のエンタープライズ情報システムにアクセスする必要があるアプリケーションで役立ちます。

 以下は、Webアプリケーション内でトランザクションを境界設定するJTAのUserTransactionインターフェイスの使用例です。

Context ic = new InitialContext();
UserTransaction ut =
(UserTransaction) ic.lookup("java:comp/UserTransaction");
ut.begin();
// perform transactional work here
ut.commit();

 ただしアプリケーション開発を行ううえで、Webアプリケーション内ではトランザクション処理を極めて限定的に利用する必要があります。極力、トランザクション処理はEJBで処理すべきです。また、Webアプリケーションでトランザクション処理を実装する場合には、トランザクションの伝播と状態の遮断に関するいくつかの制限事項に注意する必要があります。

アプレットおよびアプリケーションクライアントでのトランザクション

 アプリケーションサーバは、基本的にアプレットおよびアプリケーションクライアントのトランザクションサポートを行っていません。ただし、J2EE製品がほかとの差別化のために、この機能を提供することができます。従って、アプレットおよびアプリケーションクライアントがUserTransactionオブジェクトに直接アクセスできるかどうかは、コンテナで提供される機能によって変わります(BEA WebLogic Serverにはこの機能が実装されています)。移植性を保証するには、アプレットおよびアプリケーションクライアントがトランザクション型作業をエンタープライズBeanに委譲する必要があります。

JMSとトランザクション

 J2EEの新しい仕様であるバージョン1.3では、アプリケーションサーバはJMSサービスをトランザクションで連携するリソース・マネージャとしてサポートすることが記載されています。アプリケーションサーバはWebアプリケーションやEJBからJMSアプリケーションをトランザクションサービスを通じて利用できるように実装しなければなりません。

JCAとトランザクション

 上記のJMSと同様、J2EE 1.3ではJCAもリソース・マネージャとしてアプリケーションサーバはサポートしなければなりません。JCAのリソースアダプタはJTAのXATransactionインターフェイスの実装を必要とします。

 

Javaを紐解くための重点キーワード

 

 



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間