第5章

トランザクションの管理

トランザクションを実行するComposerアプリケーションには、特別な計画と展開が必要です。 この章では、トランザクション管理に関連するランタイムおよび展開の問題について説明します。 トランザクションアクションの利用方法といった設計時の問題については、『Composerユーザガイド』の高度なアクションに関する章を参照してください。

注記:   JTAおよびXAリソーストランザクション機能(Composerのトランザクションアクションを含む)はexteNd 5 Suite Professional Editionを備えたCompserのバージョンではサポートしていません。 完全なトランザクションサポートはComposerのEnterprise Editionバージョンで利用できます。

 
Top of page

exteNd Composerでのトランザクション制御

Composer Enterprise Editionでは、「トランザクションアクション」は、定義されたJavaトランザクションAPI (JTA)サーバ側のトランザクションコマンドを呼び出すことができます。 たとえば次のとおりです。

これらの選択肢は、状況に応じて有効または無効になり、Composerで新しいトランザクションアクションを作成すると表示される[トランザクション]ダイアログボックス(次の図を参照)から使用できます。

TxDialog

 
Top of page

Novell exteNd Application Serverに対するトランザクション展開の考慮事項

前の章の説明どおり、Composerはサーブレット、EJB、または任意のJavaクラスによってフロントエンド化できます。JavaトランザクションAPI (JTA)におけるトランザクションの定義方法の結果として、各メカニズムはトランザクション制御に重要な意味を持ちます。

 
Top of section

サーブレット展開の考慮事項

JDBC接続プールを使用するサーブレット展開は、問い合わせのみのサービスなど、複雑なトランザクション動作が必要でない場合にお勧めします。サーブレット展開には、主に次のような制限があります。

 
Top of section

EJB展開

ComposerサービスをEJBとして展開すると、柔軟性の高いトランザクション管理ができます。アプリケーションが、データをいくつかのバックエンドシステムに更新しなければならない分散トランザクション環境を必要とする場合は、EJB展開をお勧めします。EJB展開におけるexteNdの特性を説明する前に、EJBの仕様に示されているトランザクションに関する展開オプションを確認します。次のような定義を知っておくと理解しやすくなります。

「アプリケーション」は、トランザクションサービスのユーザー、通常EJBです。

「コンテナ」は、EJBが展開され実行される、アプリケーションサーバ提供のコンテキストです。

「リソースマネージャ」は、データベースまたはメッセージキューなど、バックエンドシステムのインタフェースです。

「リソースアダプタ」は、JDBCドライバなど、リソースマネージャのインタフェースです。

「トランザクションマネージャ」は、アプリケーションサーバ提供のオブジェクトであり、すべてのプレーヤ間にトランザクションをセットアップし、トランザクションの流れを制御します。通常、高レベルの呼び出しが低レベルのトランザクションの呼び出し、標準のX/Open XAプロトコルにマップされます。

次の図を参照してください。

ステートフルなBean管理トランザクションはメソッドの呼び出しを補う場合がある一方、コンテナ管理トランザクションはすべてメソッドの呼び出しに基づいています。EJBに関する文献では、EJBを使用した場合、すべてのトランザクション管理は目に見えないところで行われ、アプリケーション開発者は何も気にしなくてもよいと説明されている場合があります。これらの複雑な2段階コミットロジックは、実際には自動的に実行されます(例外の場合はロールバックが自動的に実行されます)が、開発者は、必要なアプリケーションの結果が確実に得られるように、EJBトランザクションの管理方法を理解する必要があります。

Bean管理トランザクションの境界

EJBをBean管理トランザクションとして展開する場合、UserTransactionという簡略化されたトランザクションインタフェースを通じて、トランザクションマネージャと間接的に通信する必要があります。UserTransactionにより、開始、コミット、およびロールバックなどのトランザクションコマンドを実行できます。Bean管理として展開された場合にのみ、Beanはこれらのコマンドを使用できます。EJBがコンテナ管理として展開する場合にこれらのコマンドを実行すると、IllegalStateExceptionがスローされます。このため、開発者は事前にBeanの展開方法を知っておく必要があります。

コンテナ管理トランザクションの境界

コンテナ管理トランザクションの境界は、宣言型のトランザクションサポートとも呼ばれ、トランザクションのサポートとして強力かつ柔軟な方法です。 アプリケーションのアセンブラでは、構築後EJBのトランザクションの動作を自由に決定できます。コンテナ管理トランザクションは、EJBにより他のEJBを利用して作業を完了する場合に最も役に立ちます。この場合の典型的な例は、いくつかのエンティティBeanを呼び出してデータベースのさまざまなテーブルを更新する、ステートレスなセッションBeanです。宣言型のトランザクション管理でこれらのトランザクションをリンクすると、コードの複雑さが大幅に減少し、コンポーネントで障害が起きた場合は自動的にトランザクションがロールバックされます。

EJBでは、6つの異なるコンテナ管理トランザクションタイプがサポートされます。6つを区別する最も重要な違いは、「トランザクションの伝達」の概念です。トランザクションを処理中のEJBが他のEJBを呼び出すと、そのトランザクションが2つめのEJBに渡さる場合と渡されない場合があります。トランザクションが渡される場合は、続いてトランザクションがロールバックされてから、そのトランザクションの範囲内のすべてのEJBで実行された作業がロールバックされます。

コンテナ管理トランザクションのタイプには、次のものがあります。

表5-2

トランザクションのタイプ

動作

Not Supported

トランザクションはサポートされません。

Required

トランザクションで呼び出されると、呼び出されたトランザクションが実行され、そうでない場合は作成されます。

Supports

トランザクションで呼び出されると、呼び出されたトランザクションが実行され、そうでない場合はなしで実行されます。

Requires New

常に新しいトランザクションが作成されます。呼び出し側のトランザクションは、これが完了するまで一時停止されます。

Mandatory

トランザクションで呼び出されると、呼び出されたトランザクションが使用され、そうでない場合は例外がスローされます。

Never

トランザクションで呼び出されると、例外がスローされます。

コンテナ管理トランザクションでは、いずれのタイプのコミットも呼び出すことはできません。ユーザは、EJBコンテキストでsetRollbackOnly() メソッドを呼び出すことによって、ロールバックを開始できます。ただし、この呼び出しは、特定の状況にのみ使用できます。アプリケーションが、Bean管理EJB、またはトランザクションサポートのないコンテナ管理EJBとして展開されると、setRollbackOnly()への呼び出しの結果はjava.lang.IllegalStateExceptionになります。

コンテナ管理トランザクションは、異種環境で複雑なトランザクション管理を実行する、非常に強力なメカニズムです。このように複雑な分散環境では、バックエンドのリソースマネージャ、ミドルウェアドライバ、およびアプリケーションサーバからのサポートが必要です。

注記:   この時点では、Novell exteNd Application Serverは「1つの」接続プールから複数の接続に渡る分散トランザクション管理をサポートしています。 Novell exteNd Application Server以外のサーバを使用する場合は、該当するベンダのマニュアルで確認してください。

 
Top of section

XA対応データベースドライバ

データベースに関するトランザクションを使用する前に、XA対応データベースドライブを使用していることを確認してください。 ほとんどのベンダは、XAおよび非XAバジョンのドライバを提供しています。 XA対応のドライバを使用できない場合、トランザクションのJDBCコンポーネントを登録することができますが、データベース接続を開く前(たとえば、JDBCコンポーネントを呼び出す前)にトランザクションを開始する必要があります。 事前にテストを行って信頼できることを確認してください。

 
Top of section

EJB展開の考慮事項

EJB展開は、複雑なトランザクションの動作が必要である場合にお勧めします。 デフォルトでは、展開モードは展開ウィザードの現在のトランザクションエミュレーションモード([Designer]タブを使用して、[ツール]>[初期設定]で設定)の選択に基づきます。 選択したエミュレーションモードがBean管理のEJB展開である場合は、展開ウィザードによりこのタイプの展開が作成されます。 それ以外の場合はデフォルトのTransaction Not Supportedによるコンテナ管理の展開になります。 展開ウィザードのEJBベースのサービストリガパネルで[トランザクション属性]フィールドのプルダウンメニューを使用すると、[サポートされていません]から、[必須]、[サポート]、[新規を要求]、またはBean管理またはコンテナ管理のトランザクションに対して有効な他の選択肢に変更できます。

 
Top of section

JDBCトランザクション制御 ユーザトランザクションの許可

手動によるトランザクション制御が必要になることがあります。たとえば、1つのサービスで2つのJDBCコンポーネントが必要な場合、JDBCオブジェクト間での分散トランザクション機能が不足すると、コンテナ管理、トランザクション必須モードなどのサービスを配置できなくなります。そのような状況のために、exteNd Composerには、ユーザ制御のSQLトランザクションを許可するJDBC接続コンポーネントに、特別なチェックボックスがあります。

注記:   これは拡張オプションであり、SQLプログラミングを熟知している場合のみ使用してください。

6connectproperties

[SQLトランザクションを許可]ボックスをオンにすると、次のことが実行されます。

[SQLトランザクションを許可]チェックボックスをオンにする場合、Composerサービスを従来のサーブレットトリガサービスとして、またはコンテナ管理の「サポートされていません」トランザクションモードのEJBとして展開することをお勧めします。 さらに、コミットまたはロールバックを、JDBCコンポーネントの最後のSQLステートメントとして、発行することを強くお勧めします。 一番良い方法は、Try/On FaultブロックでJDBCコンポーネントのアクション全体を囲み、例外を見つけることです。

注記:   データベースドライバは反応が異なる場合があるため、アプリケーションを展開した状態でテストし、対象のトランザクションの動作を検証してください。

 
Top of section

参照

EJBホームページ: http://java.sun.com/products/ejb

JTAホームページ: http://java.sun.com/products/ejb




Copyright © 2004 Novell, Inc. All rights reserved. Copyright © 1997, 1998, 1999, 2000, 2001, 2002, 2003 SilverStream Software, LLC. All rights reserved.  more ...