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 に依存しません。