Spring のトランザクション マジックの公開
@Transactional でメソッドにアノテーションを付けると、Spring がトリガーされて、受信メソッド呼び出しをインターセプトするプロキシ クラスを作成します。その仕組みは次のとおりです。
プロキシ クラスの作成と構造
Spring は、アノテーション付きクラスと同じインターフェイスを実装するプロキシ クラスを作成します。プロキシ クラスは、元のクラスをラップする動的に生成されるクラスです。プロキシ クラス内に、Spring はトランザクションのライフサイクル管理などのトランザクション動作を処理するコードを挿入します。
元のクラスの実際のインスタンスは影響を受けません。そのまま残りますが、元のクラスへのメソッド呼び出しはプロキシ クラスによってインターセプトされます。
プロキシ クラスの可視性
プロキシ クラスは、通常、実行時には表示されません。 Spring はプロキシを通じてメソッド呼び出しを透過的にインターセプトし、元のクラスが呼び出されているかのように見せます。ただし、デバッグ ツールや AOP フレームワークなどのツールを使用してプロキシ クラスにアクセスできます。
内部呼び出しのトランザクション スコープが制限されている
Spring のトランザクション プロキシは、からの呼び出しのみをインターセプトします。外部ソース。同じオブジェクト内で行われた呼び出し (「自己呼び出し」とも呼ばれます) はインターセプトされません。これは、このような呼び出しではプロキシ メカニズムがバイパスされるためです。
自己呼び出しの回避策
自己呼び出しメソッドのトランザクション動作を有効にするには、プロキシのインスタンスを挿入できます。 BeanFactoryPostProcessor を使用してクラスを自己参照クラスに変換します。これにより、内部呼び出しをプロキシ経由で行うことができるため、トランザクションの範囲が自己呼び出しメソッドに拡張されます。
以上がSpring の @Transactional アノテーションはどのようにトランザクションを管理し、自己呼び出しを処理するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。