![](../../special/javakey/javakeyword_gra2.gif)
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つの要素で構成されています。
- アプリケーションからトランザクションの境界設定やトランザクション管理を実行するためのインターフェイスであるjavax.transaction.UserTransaction。このインターフェイスは、Webアプリケーションや
Bean管理のトランザクションを持つEJBで使用する
- トランザクション・マネージャがアプリケーションのトランザクションの境界設定や、トランザクションの管理を行うためのインターフェイスであるjavax.transaction.TransactionManager。このインターフェイスはコンテナ管理のトランザクションを持つEJBのEJBコンテナによって使用される
- トランザクション・マネージャが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管理によるトランザクション境界設定では、EJBはJTAのjavax.transaction.UserTransactionインターフェイスを使用して、トランザクション境界を明示的に設定します。Bean管理によるトランザクション境界設定を選択できるのは、セッションBeanだけです。エンティティBeanは、常にコンテナ管理によるトランザクション境界設定を使用する必要があります。
以下のコードは、Bean管理によるトランザクション境界設定を使ってトランザクションを境界設定するJTAインターフェイスの使用法を示しています。UserTransactionオブジェクトはメソッド EJBContext.getUserTransactionを使用してルックアップされ、トランザクションで使用されます。
UserTransaction ut = ejbContext.getUserTransaction(); |
Webアプリケーション(JSP、Servlet)は、EJBのようなJTAの緊密な連携は持っていません。このため、Webアプリケーションでは、JNDIを使ってUserTransactionオブジェクトをルックアップしてから、UserTransactionインターフェイスを使ってトランザクションを境界設定します。これは、WebコンポーネントがJTAトランザクションの範囲内のエンタープライズ情報システムにアクセスする必要があるアプリケーションで役立ちます。
以下は、Webアプリケーション内でトランザクションを境界設定するJTAのUserTransactionインターフェイスの使用例です。
Context ic = new InitialContext(); |
ただしアプリケーション開発を行ううえで、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を紐解くための重点キーワード |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
![]() |
|
|
|
![]() |