Spring Framework のトランザクションサポートモデルの利点

従来、EE アプリケーション開発者は、トランザクション管理に 2 つの選択肢がありました。グローバルトランザクションとローカルトランザクションのどちらにも大きな制限があります。次の 2 つのセクションでは、グローバルおよびローカルのトランザクション管理について説明し、続いて、Spring Framework のトランザクション管理サポートがグローバルおよびローカルのトランザクションモデルの制限にどのように対処するかについて説明します。

グローバルトランザクション

グローバルトランザクションを使用すると、複数のトランザクションリソース、通常はリレーショナルデータベースとメッセージキューを操作できます。アプリケーションサーバーは、面倒な API である JTA を介してグローバルトランザクションを管理します(一部は例外モデルのため)。さらに、JTA UserTransaction は通常 JNDI をソースとする必要があります。つまり、JTA を使用するには JNDI も使用する必要があります。JTA は通常アプリケーションサーバー環境でのみ使用できるため、グローバルトランザクションを使用すると、アプリケーションコードの再利用の可能性が制限されます。

以前は、グローバルトランザクションを使用する推奨する方法は、EJB CMT(コンテナー管理トランザクション)を使用することでした。CMT は宣言型トランザクション管理の形式です(プログラムによるトランザクション管理とは区別されます)。EJB CMT を使用すると、トランザクション関連の JNDI ルックアップが不要になりますが、EJB 自体を使用するには JNDI を使用する必要があります。トランザクションを制御する Java コードを記述する必要性のすべてではなく、ほとんどを取り除きます。重大な欠点は、CMT が JTA およびアプリケーションサーバー環境に結び付けられていることです。また、EJB(または少なくともトランザクション EJB ファサードの背後)にビジネスロジックを実装することを選択した場合にのみ使用できます。一般に EJB の欠点は非常に大きいため、特に宣言型トランザクション管理の強力な代替手段に直面して、これは魅力的な提案ではありません。

ローカルトランザクション

ローカルトランザクションは、JDBC 接続に関連付けられたトランザクションなど、リソース固有です。ローカルトランザクションは使いやすいかもしれませんが、重大な欠点があります。複数のトランザクションリソース間で機能しません。例: JDBC 接続を使用してトランザクションを管理するコードは、グローバル JTA トランザクション内で実行できません。アプリケーションサーバーはトランザクション管理に関与しないため、複数のリソースにわたって正確性を確保するのに役立ちません。(ほとんどのアプリケーションが単一のトランザクションリソースを使用することは注目に値します)別の欠点は、ローカルトランザクションがプログラミングモデルに侵入することです。

Spring Framework の一貫したプログラミングモデル

Spring は、グローバルおよびローカルトランザクションの欠点を解決します。アプリケーション開発者は、あらゆる環境で一貫したプログラミングモデルを使用できます。コードを一度書くだけで、さまざまな環境でさまざまなトランザクション管理戦略を活用できます。Spring Framework は、宣言的およびプログラム的なトランザクション管理の両方を提供します。ほとんどのユーザーは宣言的なトランザクション管理を好みますが、ほとんどの場合これをお勧めします。

プログラムによるトランザクション管理により、開発者は Spring Framework トランザクションの抽象化を使用します。これは、基盤となるトランザクションインフラストラクチャ上で実行できます。推奨される宣言モデルを使用すると、開発者は通常、トランザクション管理に関連するコードをほとんどまたはまったく記述しないため、Spring Framework トランザクション API やその他のトランザクション API に依存しません。

トランザクション管理にアプリケーションサーバーが必要ですか?

Spring Framework のトランザクション管理サポートは、エンタープライズ Java アプリケーションがアプリケーションサーバーを必要とする場合に関する従来のルールを変更します。

特に、EJB を介した宣言的なトランザクションのためだけにアプリケーションサーバーは必要ありません。実際、アプリケーションサーバーに強力な JTA 機能がある場合でも、Spring Framework の宣言型トランザクションが EJB CMT よりも強力で生産的なプログラミングモデルを提供すると判断する場合があります。

通常、アプリケーションサーバーの JTA 機能が必要になるのは、アプリケーションが複数のリソースにまたがるトランザクションを処理する必要がある場合のみです。これは、多くのアプリケーションの要件ではありません。多くのハイエンドアプリケーションは、代わりに単一の高度にスケーラブルなデータベース (Oracle RAC など) を使用します。スタンドアロンのトランザクションマネージャー ( Atomikos トランザクション (英語) など) は、他のオプションです。もちろん、Java Message Service (JMS) や Jakarta EE Connector Architecture (JCA) などの他のアプリケーションサーバー機能が必要になる場合もあります。

Spring Framework を使用すると、アプリケーションを完全にロードされたアプリケーションサーバーに拡張するタイミングを選択できます。EJB CMT または JTA を使用する唯一の代替手段は、ローカルトランザクション(JDBC 接続など)でコードを記述し、そのコードをコンテナー管理のグローバルトランザクション内で実行する必要がある場合に多額の手直しに直面することでした。Spring Framework では、構成ファイル内の Bean 定義の一部のみを(コードではなく)変更する必要があります。