ホームページ >Java >&#&チュートリアル >同じクラス内で呼び出すと Spring @Transactional メソッドが失敗するのはなぜですか?

同じクラス内で呼び出すと Spring @Transactional メソッドが失敗するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-19 14:34:10148ブラウズ

Why Does My Spring @Transactional Method Fail When Called Within the Same Class?

独自のクラス内での Spring @Transaction メソッド呼び出しが失敗する

Spring Framework の宣言型トランザクション管理は、メソッド レベルでトランザクションの動作を定義する便利な方法を提供します。ただし、同じクラス内からトランザクション メソッドを呼び出そうとすると、一見奇妙な問題が発生します。

問題

提供されたコード スニペットでは、addUser メソッドは次のようになります。 @Transactional の注釈が付けられており、データベース操作を実行するように設計されています。 addUsers メソッド内で、ユーザーごとに addUser を呼び出そうとします。ただし、意図したとおりに動作していないようです。

原因

この動作は、特に Spring AOP (アスペクト指向プログラミング) の制限によるものです。動的オブジェクトと CGLIB ライブラリを使用する場合。 CGLIB は、AOP のメソッド インターセプトを実装するために既存のクラスのサブクラスを作成します。この場合のように、メソッドが作成されたのと同じクラス内でメソッドが呼び出される場合、AOP プロキシはバイパスされます。

解決策

この問題を解決するには、いくつかの可能なアプローチがあります:

  1. AspectJ を使用する: AOP の動的オブジェクトの代わりに AspectJ を使用するように Spring を構成すると、コードは期待どおりに機能します。
  2. コードのリファクタリング: あるいは、コードをリファクタリングして、ユーザー処理ロジックを 2 つのクラスに分離します。 。これにより、@Transactional メソッドを別のオブジェクトから呼び出すことができ、AOP が意図したとおりに適用されます。
  3. AspectJ の設定 (レガシー サポート): 3.0 より前の Spring バージョンの場合、次のことが必要です。 Spring XML に AspectJ 設定を手動で追加する

結論

Spring AOP の制限を理解し、同じクラス内からトランザクション メソッドを呼び出すための適切なソリューションを見つけることは、効果的なトランザクション管理には不可欠です。春のアプリケーション。この記事で説明する代替アプローチは、この特定のハードルを克服する方法を提供します。

以上が同じクラス内で呼び出すと Spring @Transactional メソッドが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。