宣言的トランザクション管理

ほとんどの Spring Framework ユーザーは、宣言的なトランザクション管理を選択します。このオプションは、アプリケーションコードへの影響が最も少ないため、非侵襲的な軽量コンテナーの理想と最も一致しています。

Spring Framework の宣言的なトランザクション管理は、Spring アスペクト指向プログラミング(AOP)によって可能になります。ただし、トランザクションアスペクトコードは Spring Framework ディストリビューションに付属しており、定型的な方法で使用できるため、このコードを効果的に使用するために AOP の概念を一般的に理解する必要はありません。

Spring Framework の宣言的なトランザクション管理は、EJB CMT に似ており、個々のメソッドレベルまでトランザクションの動作(またはその欠如)を指定できます。必要に応じて、トランザクションコンテキスト内で setRollbackOnly() 呼び出しを行うことができます。2 種類のトランザクション管理の違いは次のとおりです。

  • JTA に関連付けられている EJB CMT とは異なり、Spring Framework の宣言的トランザクション管理はどの環境でも機能します。JDBC、JPA、Hibernate を使用して構成ファイルを調整することにより、JTA トランザクションまたはローカルトランザクションを処理できます。

  • Spring Framework 宣言型トランザクション管理は、EJB などの特別なクラスだけでなく、任意のクラスに適用できます。

  • Spring Framework は、EJB に相当する機能がない宣言型ロールバックルールを提供します。ロールバックルールに対するプログラムと宣言の両方のサポートが提供されます。

  • Spring Framework では、AOP を使用してトランザクションの動作をカスタマイズできます。例: トランザクションのロールバックの場合にカスタム動作を挿入できます。トランザクションアドバイスとともに、任意のアドバイスを追加することもできます。EJB CMT では、setRollbackOnly() を除き、コンテナーのトランザクション管理に影響を与えることはできません。

  • Spring Framework は、ハイエンドアプリケーションサーバーのように、リモートコール間でのトランザクションコンテキストの伝播をサポートしません。この機能が必要な場合は、EJB を使用することをお勧めします。ただし、通常、トランザクションがリモートコールにまたがることを望まないため、このような機能を使用する前に慎重に検討してください。

ロールバックルールの概念は重要です。これらを使用すると、自動ロールバックを引き起こす例外(およびスロー可能オブジェクト)を指定できます。これは、Java コードではなく、構成で宣言的に指定できます。そのため、TransactionStatus オブジェクトで setRollbackOnly() を呼び出して現在のトランザクションをロールバックできますが、ほとんどの場合、MyApplicationException が常にロールバックする必要があるというルールを指定できます。このオプションの大きな利点は、ビジネスオブジェクトがトランザクションインフラストラクチャに依存しないことです。例: 通常、Spring トランザクション API または他の Spring API をインポートする必要はありません。

EJB コンテナーのデフォルトの動作は、システム例外(通常はランタイム例外)でトランザクションを自動的にロールバックしますが、EJB CMT はアプリケーション例外(つまり、java.rmi.RemoteException 以外のチェック済み例外)でトランザクションを自動的にロールバックしません。宣言的トランザクション管理の Spring のデフォルトの動作は EJB の規則に従います(ロールバックは未チェックの例外に対してのみ自動化されます)が、この動作をカスタマイズすると便利な場合があります。