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 実装を使用します。

@Transactional は通常、PlatformTransactionManager によって管理されるスレッドバインドトランザクションで機能し、トランザクションを現在の実行スレッド内のすべてのデータアクセス操作に公開します。注: これは、メソッド内で新しく開始されたスレッドに伝播されませ

ReactiveTransactionManager によって管理されるリアクティブトランザクションは、スレッドローカル属性の代わりに Reactor コンテキストを使用します。結果として、参加しているすべてのデータアクセス操作は、同じリアクティブパイプラインの同じ Reactor コンテキスト内で実行する必要があります。

ReactiveTransactionManager を使用して構成すると、トランザクションで区切られたすべてのメソッドがリアクティブパイプラインを返すことが期待されます。void メソッドまたは通常の戻り値の型は、通常の PlatformTransactionManager に関連付ける必要があります。対応する @Transactional 宣言の transactionManager 属性を通じて。

次の図は、トランザクションプロキシでメソッドを呼び出す概念図を示しています。

tx