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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-19 04:47:09380ブラウズ

Why Do @Transactional Methods Fail When Self-Invoked Within the Same Class in Spring?

同じクラス内のトランザクション メソッド呼び出しの問題

問題:

Spring で、次の注釈が付けられたメソッドを呼び出そうとしている同じクラス内からの @Transaction は非効率的な結果となる可能性があります。 transaction.

コード例:

public class UserService {

    @Transactional
    public boolean addUser(String userName, String password) {
        // ...
    }

    public boolean addUsers(List<User> users) {
        for (User user : users) {
            addUser(user.getUserName, user.getPassword);
        }
    }
}

問題の理解:

この問題は Spring の制限により発生しますAOP の動的オブジェクト処理と cglib の使用。 Spring のデフォルトのトランザクション処理メカニズムは、cglib で作成された動的プロキシを使用するため、同じクラス内からトランザクション メソッドを呼び出すときに不一致が発生する可能性があります。

解決策:

トランザクション処理に AspectJ を使用する:

解決するにはこれにより、トランザクションの処理に AspectJ を使用するように Spring を設定できます。これには以下が含まれます:

  • tx:annotation-driven でモードを aspectj に設定:

    <tx:annotation-driven mode="aspectj"/>
  • 次の Bean 構成を追加します (春バージョンは以下3.0):

    <bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf">
      <property name="transactionManager" ref="transactionManager"/>
    </bean>

リファクタリング:

別の解決策は、コードをリファクタリングすることです。同じクラス内からトランザクション メソッドを呼び出す代わりに、ユーザー処理と処理用に別のクラスを作成して、Spring AOP を使用したデフォルトのトランザクション処理を有効にすることを検討してください。

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

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