@Transactional を使用すると何が起こりますか?
メソッドにアノテーションを付けると@Transactional、Spring はアノテーション付きクラスのプロキシ クラスを作成します。このプロキシ クラスは、外部メソッド呼び出しをインターセプトし、それらにトランザクション動作を適用します。
プロキシ クラス インターセプト
プロキシ クラスには、アノテーション付きクラスで宣言されたメソッドの実装が含まれています。外部メソッド呼び出しが行われると、元のクラスではなくプロキシ クラスにリダイレクトされます。その後、プロキシ クラスは、トランザクション管理を含む、メソッド呼び出しに関連する必要な前処理および後処理を実行できます。
自己呼び出しに関する考慮事項
Spring のトランザクション管理メカニズムのみ外部メソッド呼び出しをインターセプトします。これは、ターゲット オブジェクト内のメソッドが同じオブジェクト内の別のメソッドを呼び出す自己呼び出しでは、トランザクションが自動的に開始されないことを意味します。これは、自己呼び出しがプロキシ メカニズムをバイパスするためです。
可視プロキシ クラス
生成されたプロキシ クラスは、リフレクションを使用して表示できます。ターゲット クラスをイントロスペクトし、宣言されたクラスを取得することで、その情報にアクセスできます。通常、プロキシ クラスには「$Proxy」という接尾辞が付けられます。
なぜ外部呼び出しのみなのか?
外部メソッド呼び出しのみがトランザクション下にある理由は、無限再帰を避けるためです。 。自己呼び出しによってトランザクションも開始された場合、メソッドが新しいトランザクションを開始し、次にメソッド自体を呼び出して別のトランザクションを開始するという状況が発生し、無限ループが発生する可能性があります。
以上がSpring の @Transactional アノテーションはトランザクションをどのように管理するのですか?また、自己呼び出しでは機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。