Spring の @Transactional アノテーション: 詳細な説明
背景
Spring の @Transactional アノテーションを簡略化しますデータベーストランザクションの宣言的管理。メソッドに適用すると、基礎となるデータベース操作がトランザクション内で実行されることが保証されます。ただし、このアノテーションには詳細な検討が必要な特定の技術性と制限があります。
プロキシの作成
メソッド呼び出しを動的にインターセプトするために、Spring は Java 動的プロキシ ( JDK) または CGLIB プロキシ。プロキシ クラスは、アドバイスされたクラスとも呼ばれ、元のアノテーション付きクラスのインターフェイスを継承し、メソッドを実装します。プロキシはクライアントと元のクラスの間の仲介者として機能し、抽象化層を提供します。
内部メソッド呼び出し
Spring のドキュメントによると、外部メソッド呼び出しは、プロキシは傍受され、トランザクション管理を含めて適切に処理されます。ただし、アノテーションが付けられたクラス内のメソッドが同じクラス内の別のメソッドを呼び出す自己呼び出しはインターセプトされません。これは、プロキシ机制の動作方法と this 参照の処理方法によるものです。
なぜ制限があるのですか?
メソッドが同じメソッド内で別のメソッドを呼び出すときクラスの場合、プロキシをバイパスして、 this 参照を通じて直接これを行います。これは、プロキシが内部メソッド呼び出しに関与していないため、トランザクション管理動作を挿入できないことを意味します。
制限の克服
この制限を克服するには、1 つの解決策があります。 BeanFactoryPostProcessor を使用して、実行時にプロキシのインスタンスを自己参照クラスに挿入します。このプロキシ参照を変数に保存すると、内部呼び出しがプロキシ経由で行われ、トランザクション管理ロジックを適用できるようになります。
追加リソース
以上がSpring の @Transactional アノテーションは内部メソッド呼び出しをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。