ローカル・トランザクション内包
IBM® WebSphere® Application Server では、ローカル・トランザクション拡張デプロイメント記述子を使用して構成することができる、ローカル・トランザクション包含 (LTC) がサポートされています。 LTC サポートは、アプリケーション・プログラマーにいくつかの利点をもたらします。提供されているシナリオと、考慮すべきポイントのリストを使用すると、ローカル・トランザクションに対するトランザクション・サポートを構成するための最良の方法を決定するのに役立ちます。
以下のセクションでは、LTC サポートが提供する利点、および各状況でのローカル・トランザクション拡張デプロイメント記述子の設定方法について説明します。
- エンタープライズ Bean、または、独立していて調整の必要のない 1 つ以上のデータベースにアクセスするサーブレットを開発できます。
- エンタープライズ Bean がグローバル・トランザクションを使用する必要がない場合は、Required ではなく NotSupported に設定されたコンテナー・トランザクション・タイプのデプロイメント記述子を使用して、その Bean をデプロイするほうが効果的なことがしばしばあります。
アプリケーションは、アプリケーション・サーバーの拡張ローカル・トランザクション・サポートを使用することにより、グローバル・トランザクション内にあるときと同じ、未指定のトランザクション・コンテキスト内のビジネス・ロジックを実行することができます。例えば、エンタープライズ Bean は、コンテナー・トランザクション・タイプとして NotSupported または Never を指定してデプロイされた場合、未指定のトランザクション・コンテキストで実行されます。
拡張ローカル・トランザクション・サポートは、コンテナー管理の、暗黙のローカル・トランザクション境界を提供します。この境界内で、コンテナーは、アプリケーションの更新およびその接続のクリーンアップをコミットします。 アプリケーションは、デプロイメントの問題からさらに独立して設計できます。 これにより、例えばグローバル・トランザクション・コンテキストの有無にかかわらず ビジネス・ロジックが呼び出される場合などに、コンテナー・トランザクション・タイプの Supports の使用を大幅に簡素化されます。
アプリケーションは、トランザクション内で実行されているかどうかに関係なく、 獲得、使用、クローズ (get-use-close) パターンの接続方法に従うことができます。アプリケーションは、 グローバル・トランザクションがなくても、すべての状態においてクローズ・アクションに依存して同様の振る舞いを行い、すなわち、クローズ・アクションが接続時のロールバックを引き起こさないようにすることができます。
複数のリソース・マネージャーの ACID 調整が必要ないシナリオは、多数あります。 そのようなシナリオでは、Transaction ポリシーを NotSupported にして ビジネス・ロジックを実行した方が、Required ポリシーの場合よりもパフォーマンスが上がります。 この利点は、Local Transactions セクションのデプロイメント記述子で、Resolver 属性を ContainerAtBoundary に設定することにより適用されます。 この設定を使用すると、アプリケーションとデータベースなどのリソース・プロバイダーとの対話が、コンテナーによって開始と終了の両方が行われる暗黙のリソース・マネージャー・ローカル・トランザクション (RMLT) 内で管理されます。 コンテナーは、ローカル・トランザクション・セクション内の Boundary 属性によって指定される内包境界 (例えば、メソッドの終わりなど) で RMLT をコミットします。 例外によってアプリケーションからコンテナーにコントロールが戻された場合には、始動済みのすべての RMLT がコンテナーによってロールバックされます。
この使用方法は、サーブレットとエンタープライズ Bean の両方に適用されます。
- クリーンアップを保障する管理された環境でのローカル・トランザクションを使用できます。
- RMLT を明示的に開始および終了することにより RMLT を制御する必要のあるアプリケーションでは、Local Transactions セクションにある Resolver 拡張デプロイメント記述子にデフォルト設定で Application を使用することができます。
この場合、コンテナーは、ローカル・トランザクション・コンテキストの境界で、接続を確実にクリーンアップします。
アプリケーションによるローカル・トランザクションの使用方法を説明したエンタープライズ・アプリケーション仕様の Java™ プラットフォームでは、Local Transactions セクションにある Resolver 拡張デプロイメント記述子のデフォルト設定である Application、および Unresolved アクション拡張デプロイメント記述子のデフォルト設定である Rollback によって提供される方法で、これが行われます。 ローカル・トランザクション・セクション内の未解決アクション拡張デプロイメント記述子が Commit に設定されると、コンテナーは、アプリケーションは開始するが、ローカル・トランザクション内包が終了したとき (例えば、メソッドの終了時) に完了しない、すべての RMLT をコミットします。 この使用方法は、サーブレットとエンタープライズ Bean の両方に適用されます。
EJB コンポーネント・メソッドの期間を超えた、ローカル・トランザクションの期間を延長できます。
Enterprise JavaBeans (EJB) の仕様では、 RMLT は単一の EJB メソッドに対して使用するように制限されます。これは、この仕様では 、コンテナーによって管理されるメソッド境界の外で範囲設定を行うデバイス がこの仕様になく、RMLT を拡張することができないからです。ローカル・トランザクション・セクション内の Boundary 拡張デプロイメント設定を使用して、以下の利点を得ることができます。
- RMLT の使用状況を著しく拡張させる。
- ActivitySession サポートにより 1 フェーズ・リソース・マネージャーとの会話型相互作用を可能にする
ActivitySession を使用して、単一のメソッドより長い境界を持 つ分散コンテキストを提供することができます。 より長い ActivitySession 境界で使用できるよう RMLT を拡張す ることができます (クライアントによって制御可能)。 ActivitySession 境界は、複数のリソース上での ACID 操作が不要な分散トランザクションを使用する必要性を減らします。この利点は、ローカル・トランザクション・セクション内の ActivitySession の Boundary 拡張デプロイメント設定を使用して適用されます。 このような拡張 RMLT は、Local Transactions セクションにある Resolver デプロイメント記述子の設定に応じて、アプリケーションの制御下に置かれたままになることも、コンテナーによって管理されることもあります。
- 複数の 1 フェーズ・リソース・マネージャーを調整できます。
- XA トランザクション調整をサポートしていないリソース・マネージャーの場合、 クライアントは、ActivitySession によってバウンドされたローカル・トランザクション・コンテキストを使用することができます。 このようなコンテキストによって、クライアントは、トランザクションのリソース・マネージャーに対する場合と同様に、 リソース・マネージャーによるリソースの更新の完了指示をコントロールすることができます。 クライアントは、ActivitySession を開始して、そのコンテキスト内でエンティティー Bean を呼び出すことができます。 それらの Bean は、ActivitySession の範囲内で RMLT を実行し、RMLT を完了せずに戻ることができます。 クライアントは、その後、コミットまたはロールバック指示の中で ActivitySession を完了し、 調整された指示の中で、ActivitySession によってバインドされた RMLT をコンテナーにより駆動させることができます。
- 共有可能な LTC を使用して、必要な接続数を削減できます。
- アプリケーション・コンポーネントは LTC を共有できます。コンポーネントは、同じリソース・マネージャーへの接続を取得し、同じグローバル・トランザクションまたは共有可能 LTC の下で実行されている場合、その接続を共有することができます。 2 つのコンポーネントを構成して同じ共有可能 LTC の下で実行させるには、 各コンポーネントのデプロイメント記述子に Local Transactions セクションの Shareable 属性を設定します。このエレメントが指定されている場合、各コンポーネントのデプロイメント記述子のリソース参照に、res-sharing-scope エレメントのデフォルト値 Shareable が使用されていることを確認してください。共有可能 LTC により、アプリケーションが使用する RMLT の数が削減されます。例えば、呼び出しなどの Web モジュールを頻繁に使用するアプリケーションでは、それらの Web モジュール間でリソース・マネージャー接続を共有することができ、共有可能 LTC またはグローバル・トランザクションのいずれかを活用して、リソースのロック競合を低減することができます。
ローカル・トランザクションのサポート構成の例
以下のリストには、ローカル・トランザクションを使用するシナリオ、およびアプリケーションのトランザクション・サポートを構成する最良の方法を決定するときの考慮点 が示されています。
- アプリケーションの中で、グローバル・トランザクションを明示的に開始および終了する場合 (Bean 管理トランザクションのセッション Bean およびサーブレットのみ)。
セッション Bean の場合には、コンポーネントのデプロイメント記述子内で、Transaction タイプ を Bean (Bean によって管理されたトランザクションを使用する) に設定します。サーブレットの場合、この作業は不要です。
メソッド内で、XA または XA 以外の単一のリソースにのみアクセスする場合。
Local Transactions セクションにあるコンポーネントのデプロイメント記述子で、Resolver 属性を ContainerAtBoundary に設定します。 Container Transactions セクションで、コンテナー・トランザクション・タイプを Supports に設定します。
- 1 つ以上の Bean メソッドを経由して、自動的にいくつかの XA リソースにアクセスする場合。
Container Transactions セクションにあるコンポーネントのデプロイメント記述子で、コンテナー・トランザクション・タイプを Required、RequiresNew、または Mandatory に設定します。
所有するローカル・トランザクションを管理する必要なしに、単一のメソッド内の XA 以外のいくつかのリソースにアクセスする場合。
Local Transactions セクションにあるコンポーネントのデプロイメント記述子で、Resolver 属性を ContainerAtBoundary に設定します。 Container Transactions セクションで、コンテナー・トランザクション・タイプを NotSupported に設定します。
- 単一のメソッド内の XA 以外のいくつかのリソースにアクセスし、それらを個別に管理する場合。
Local Transactions セクションにあるコンポーネントのデプロイメント記述子で、Resolver 属性を Application に設定し、Unresolved アクション属性を Rollback に設定します。 Container Transactions セクションで、コンテナー・トランザクション・タイプを NotSupported に設定します。
所有するローカル・トランザクションを管理する必要なしに、複数の EJB メソッド呼び出しを経由して、XA 以外の 1 つ以上のリソースにアクセスする場合。
Local Transactions セクションにあるコンポーネントのデプロイメント記述子で、Resolver 属性を ContainerAtBoundary に設定し、Boundary 属性を ActivitySession に設定します。 Bean Cache セクションで、Activate 属性を ActivitySession に設定します。 Container Transactions セクションで、コンテナー・トランザクション・タイプを NotSupported に設定し、ActivitySession と同類の属性を Required、RequiresNew、または Mandatory に設定します。
複数の EJB メソッド呼び出しを経由して XA 以外のいくつかのリソースにアクセスし、それらを個別に管理する場合。
Local Transactions セクションにあるコンポーネントのデプロイメント記述子で、Resolver 属性を Application に設定し、Boundary 属性を ActivitySession に設定します。 Bean Cache セクションで、Activate 属性を ActivitySession に設定します。 Container Transactions セクションで、コンテナー・トランザクション・タイプを NotSupported に設定し、ActivitySession と同類の属性を Required、RequiresNew、または Mandatory に設定します。
複数の 2 フェーズ RRS リソースとともに、XA 以外のリソースを使用する場合。
トランザクション内で XA 以外のリソースを RRS リソースとともに使用することは、グローバル・トランザクションがアクティブである場合は、 常にサポートされています。グローバル・トランザクションは、コンテナー・トランザクション・タイプのデプロイメント記述子が Supports、Required、RequiresNew、または Mandatory に設定されている場合にアクティブになります。 また、グローバル・トランザクションは、コンポーネントによって管理されているデプロイメントに対してもアクティブです。 コンテナーで、XA 以外のリソース・ローカル・トランザクションの完了は、RRS リソースとともに管理されます。