![]() ![]() ![]() ![]() ![]() ![]() | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
第5章
トランザクションを実行するComposerアプリケーションには、特別な計画と展開が必要です。 この章では、トランザクション管理に関連するランタイムおよび展開の問題について説明します。 トランザクションアクションの利用方法といった設計時の問題については、『Composerユーザガイド』の高度なアクションに関する章を参照してください。
注記: JTAおよびXAリソーストランザクション機能(Composerのトランザクションアクションを含む)はexteNd 5 Suite Professional Editionを備えたCompserのバージョンではサポートしていません。 完全なトランザクションサポートはComposerのEnterprise Editionバージョンで利用できます。
Composer Enterprise Editionでは、「トランザクションアクション」は、定義されたJavaトランザクションAPI (JTA)サーバ側のトランザクションコマンドを呼び出すことができます。 たとえば次のとおりです。
これらの選択肢は、状況に応じて有効または無効になり、Composerで新しいトランザクションアクションを作成すると表示される[トランザクション]ダイアログボックス(次の図を参照)から使用できます。
前の章の説明どおり、Composerはサーブレット、EJB、または任意のJavaクラスによってフロントエンド化できます。JavaトランザクションAPI (JTA)におけるトランザクションの定義方法の結果として、各メカニズムはトランザクション制御に重要な意味を持ちます。
JDBC接続プールを使用するサーブレット展開は、問い合わせのみのサービスなど、複雑なトランザクション動作が必要でない場合にお勧めします。サーブレット展開には、主に次のような制限があります。
デフォルトでは、接続プールからサーブレットへのJDBC接続は、自動コミットが「オン」の状態に設定されています。Update、Delete、Insertの各ステートメントの後、トランザクションは自動的にデータベースにコミットされるということです。それ以降のロールバックは影響ありません。この動作を変更するには、次の2つの方法があります。
1. (トランザクションアクションを使用して)トランザクションの開始コマンドを実行し、次に必要に応じて実行またはロールバックコマンドを使用します。
2. 接続に対して[SQLトランザクションを許可]チェックボックスをオンにします。詳細については、JDBCトランザクション制御 ユーザトランザクションの許可を参照してください。
注記: ネストされたトランザクションは使用できませんが、連続するトランザクションは使用できます。
ComposerサービスをEJBとして展開すると、柔軟性の高いトランザクション管理ができます。アプリケーションが、データをいくつかのバックエンドシステムに更新しなければならない分散トランザクション環境を必要とする場合は、EJB展開をお勧めします。EJB展開におけるexteNdの特性を説明する前に、EJBの仕様に示されているトランザクションに関する展開オプションを確認します。次のような定義を知っておくと理解しやすくなります。
「アプリケーション」は、トランザクションサービスのユーザー、通常EJBです。
「コンテナ」は、EJBが展開され実行される、アプリケーションサーバ提供のコンテキストです。
「リソースマネージャ」は、データベースまたはメッセージキューなど、バックエンドシステムのインタフェースです。
「リソースアダプタ」は、JDBCドライバなど、リソースマネージャのインタフェースです。
「トランザクションマネージャ」は、アプリケーションサーバ提供のオブジェクトであり、すべてのプレーヤ間にトランザクションをセットアップし、トランザクションの流れを制御します。通常、高レベルの呼び出しが低レベルのトランザクションの呼び出し、標準のX/Open XAプロトコルにマップされます。
次の図を参照してください。
ステートフルなBean管理トランザクションはメソッドの呼び出しを補う場合がある一方、コンテナ管理トランザクションはすべてメソッドの呼び出しに基づいています。EJBに関する文献では、EJBを使用した場合、すべてのトランザクション管理は目に見えないところで行われ、アプリケーション開発者は何も気にしなくてもよいと説明されている場合があります。これらの複雑な2段階コミットロジックは、実際には自動的に実行されます(例外の場合はロールバックが自動的に実行されます)が、開発者は、必要なアプリケーションの結果が確実に得られるように、EJBトランザクションの管理方法を理解する必要があります。
EJBをBean管理トランザクションとして展開する場合、UserTransactionという簡略化されたトランザクションインタフェースを通じて、トランザクションマネージャと間接的に通信する必要があります。UserTransactionにより、開始、コミット、およびロールバックなどのトランザクションコマンドを実行できます。Bean管理として展開された場合にのみ、Beanはこれらのコマンドを使用できます。EJBがコンテナ管理として展開する場合にこれらのコマンドを実行すると、IllegalStateExceptionがスローされます。このため、開発者は事前にBeanの展開方法を知っておく必要があります。
コンテナ管理トランザクションの境界は、宣言型のトランザクションサポートとも呼ばれ、トランザクションのサポートとして強力かつ柔軟な方法です。 アプリケーションのアセンブラでは、構築後EJBのトランザクションの動作を自由に決定できます。コンテナ管理トランザクションは、EJBにより他のEJBを利用して作業を完了する場合に最も役に立ちます。この場合の典型的な例は、いくつかのエンティティBeanを呼び出してデータベースのさまざまなテーブルを更新する、ステートレスなセッションBeanです。宣言型のトランザクション管理でこれらのトランザクションをリンクすると、コードの複雑さが大幅に減少し、コンポーネントで障害が起きた場合は自動的にトランザクションがロールバックされます。
EJBでは、6つの異なるコンテナ管理トランザクションタイプがサポートされます。6つを区別する最も重要な違いは、「トランザクションの伝達」の概念です。トランザクションを処理中のEJBが他のEJBを呼び出すと、そのトランザクションが2つめのEJBに渡さる場合と渡されない場合があります。トランザクションが渡される場合は、続いてトランザクションがロールバックされてから、そのトランザクションの範囲内のすべてのEJBで実行された作業がロールバックされます。
コンテナ管理トランザクションのタイプには、次のものがあります。
コンテナ管理トランザクションでは、いずれのタイプのコミットも呼び出すことはできません。ユーザは、EJBコンテキストでsetRollbackOnly()
メソッドを呼び出すことによって、ロールバックを開始できます。ただし、この呼び出しは、特定の状況にのみ使用できます。アプリケーションが、Bean管理EJB、またはトランザクションサポートのないコンテナ管理EJBとして展開されると、setRollbackOnly()
への呼び出しの結果はjava.lang.IllegalStateException
になります。
コンテナ管理トランザクションは、異種環境で複雑なトランザクション管理を実行する、非常に強力なメカニズムです。このように複雑な分散環境では、バックエンドのリソースマネージャ、ミドルウェアドライバ、およびアプリケーションサーバからのサポートが必要です。
注記: この時点では、Novell exteNd Application Serverは「1つの」接続プールから複数の接続に渡る分散トランザクション管理をサポートしています。 Novell exteNd Application Server以外のサーバを使用する場合は、該当するベンダのマニュアルで確認してください。
データベースに関するトランザクションを使用する前に、XA対応データベースドライブを使用していることを確認してください。 ほとんどのベンダは、XAおよび非XAバジョンのドライバを提供しています。 XA対応のドライバを使用できない場合、トランザクションのJDBCコンポーネントを登録することができますが、データベース接続を開く前(たとえば、JDBCコンポーネントを呼び出す前)にトランザクションを開始する必要があります。 事前にテストを行って信頼できることを確認してください。
EJB展開は、複雑なトランザクションの動作が必要である場合にお勧めします。 デフォルトでは、展開モードは展開ウィザードの現在のトランザクションエミュレーションモード([Designer]タブを使用して、[ツール]>[初期設定]で設定)の選択に基づきます。 選択したエミュレーションモードがBean管理のEJB展開である場合は、展開ウィザードによりこのタイプの展開が作成されます。 それ以外の場合はデフォルトのTransaction Not Supportedによるコンテナ管理の展開になります。 展開ウィザードのEJBベースのサービストリガパネルで[トランザクション属性]フィールドのプルダウンメニューを使用すると、[サポートされていません]から、[必須]、[サポート]、[新規を要求]、またはBean管理またはコンテナ管理のトランザクションに対して有効な他の選択肢に変更できます。
手動によるトランザクション制御が必要になることがあります。たとえば、1つのサービスで2つのJDBCコンポーネントが必要な場合、JDBCオブジェクト間での分散トランザクション機能が不足すると、コンテナ管理、トランザクション必須モードなどのサービスを配置できなくなります。そのような状況のために、exteNd Composerには、ユーザ制御のSQLトランザクションを許可するJDBC接続コンポーネントに、特別なチェックボックスがあります。
注記: これは拡張オプションであり、SQLプログラミングを熟知している場合のみ使用してください。
[SQLトランザクションを許可]ボックスをオンにすると、次のことが実行されます。
JDBCコンポーネントの最後の「SQL実行アクション」がコミットまたはロールバックでない場合、exteNd Composer Enterprise ServerによりJDBC接続にロールバックが実行されます。
注記: 接続プールを使用する際この動作が重要です。 プールに接続を返す場合、プールマネージャには未使用の接続が提供される必要があります。 変更がコミットされていない未完了の接続を返すと、テーブルのロック、およびトランザクションスコープの不一致など、望まない結果になる場合があります。 これを防ぐために、Composerでは、ユーザが明示的にコミットを命じない限り、ロールバックを実行することによって不正な接続を検出し、その接続を削除しようとします。ボトムライン: トランザクション処理が可能なロジックがエラーなく実行された場合、データベースの操作が完了後に、JDBCコンポーネントアクションモデルの最後に「コミット」を(トランザクションアクションとともに)実行することが重要です。
[SQLトランザクションを許可]チェックボックスをオンにする場合、Composerサービスを従来のサーブレットトリガサービスとして、またはコンテナ管理の「サポートされていません」トランザクションモードのEJBとして展開することをお勧めします。 さらに、コミットまたはロールバックを、JDBCコンポーネントの最後のSQLステートメントとして、発行することを強くお勧めします。 一番良い方法は、Try/On FaultブロックでJDBCコンポーネントのアクション全体を囲み、例外を見つけることです。
注記: データベースドライバは反応が異なる場合があるため、アプリケーションを展開した状態でテストし、対象のトランザクションの動作を検証してください。
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 ...