ホームページ >Java >&#&チュートリアル >同じクラス内で呼び出すと Spring トランザクションが失敗するのはなぜですか?
Spring では、通常、トランザクション メソッドには @Transaction アノテーションが付けられます。トランザクションメソッドが呼び出されると、Spring はトランザクションのライフサイクルを自動的に管理し、例外が発生した場合でもデータの整合性を確保します。ただし、トランザクション メソッドが同じクラス内から呼び出される場合、予期しない動作が発生します。トランザクションはバイパスされているようで、開発者は頭を悩ませています。
Spring は動的プロキシ (CGLIB など) を使用してメソッド呼び出しをインターセプトし、トランザクション動作を適用します。ただし、トランザクション メソッドが同じクラス内の別のトランザクション メソッドを呼び出す場合、動的プロキシはバイパスされます。これは、ターゲット オブジェクトがどちらの場合も同じであり、プロキシが外部メソッド呼び出し用にのみ作成されるためです。
この問題を解決するには、次の手順を実行します。 2 つのオプション:
トランザクション処理用に AspectJ を設定するには、次のようにします。次の手順に従います:
3.0 より前の Spring バージョンの場合は、次の Bean 定義も設定に追加します。
<bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf"> <property name="transactionManager" ref="transactionManager" /> </bean>
AspectJ を採用するか、コードをリファクタリングすると、Spring のデフォルトのトランザクション処理の制限を克服し、内部でネストされた呼び出しであっても、一貫したトランザクション動作を保証できます。同じクラスです
以上が同じクラス内で呼び出すと Spring トランザクションが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。