Spring Framework の宣言的トランザクションの実装を理解する
クラスに @Transactional
アノテーションを付け、構成に @EnableTransactionManagement
を追加し、すべてがどのように機能するかを理解するように指示するだけでは不十分です。より深い理解を提供するために、このセクションでは、トランザクション関連の課題のコンテキストで、Spring Framework の宣言型トランザクションインフラストラクチャの内部動作について説明します。
Spring Framework の宣言型トランザクションサポートに関して理解しておくべき最も重要な概念は、このサポートが AOP プロキシを介して有効になることと、トランザクションアドバイスがメタデータ (現在は XML またはアノテーションベース) によって駆動されるということです。AOP とトランザクションメタデータを組み合わせると、TransactionInterceptor
を適切な TransactionManager
実装と組み合わせて使用し、メソッド呼び出しに関するトランザクションを駆動する AOP プロキシが生成されます。
Spring AOP については、 "AOP" セクションで説明します。 |
Spring Framework の TransactionInterceptor
は、命令型およびリアクティブプログラミングモデルのトランザクション管理を提供します。インターセプターは、メソッドの戻り値の型をインスペクションすることにより、トランザクション管理の目的のフレーバーを検出します。Publisher
や Kotlin Flow
(またはそれらのサブ型)などのリアクティブ型を返すメソッドは、リアクティブトランザクション管理の対象となります。void
を含む他のすべての戻り値の型は、命令型トランザクション管理にコードパスを使用します。
トランザクション管理の種類は、必要なトランザクションマネージャーに影響を与えます。命令型トランザクションでは PlatformTransactionManager
が必要ですが、リアクティブ型トランザクションでは ReactiveTransactionManager
実装を使用します。
|
次の図は、トランザクションプロキシでメソッドを呼び出す概念図を示しています。