Spring トランザクション: 同じクラス内のメソッド呼び出しの処理
トランザクションを処理するためにメソッドに @Transactional アノテーションを付けると、予期しない動作が発生する可能性があります同じクラス内からそのメソッドを呼び出すとき。トランザクションは期待どおりに適用されない可能性があります。
この問題を解決するには、Spring がデフォルトで AOP (アスペクト指向プログラミング) を使用してトランザクション管理を実装していることを理解することが重要です。 AOP に CGLIB を使用する場合 (デフォルト)、アノテーション付きクラスのプロキシ インスタンスが作成されます。これは、メソッドが同じクラス内から呼び出された場合、元のクラスではなくプロキシ インスタンスと対話するため、トランザクションが適用されないことを意味します。
解決策: トランザクション管理に AspectJ を有効にする
この制限を克服するには、次のコードを追加して、Spring 構成でトランザクション管理用に AspectJ を有効にします。コード:
<tx:annotation-driven mode="aspectj"/>
AspectJ を構成すると、Spring は AspectJ を使用してトランザクションを管理し、同じクラス内のメソッド呼び出しの問題を解決します。
代替アプローチ: コードのリファクタリング
AspectJ を使用したくない場合は、コードをリファクタリングして、トランザクション処理を別のクラスまたはサービスに分離します。これにより、アノテーションが付けられたトランザクション メソッドを別のクラスから呼び出すことができ、トランザクションが正しく適用されます。
たとえば、次のコードを考えてみましょう。
public class UserService { private UserServiceHelper helper; public boolean addUser(String userName, String password) { return helper.addUser(userName, password); } } public class UserServiceHelper { @Transactional public boolean addUser(String userName, String password) { // Transactional logic... } }
この場合では、トランザクション メソッド addUser がヘルパー クラスで定義され、UserService クラスがこのメソッドを呼び出します。このシナリオではトランザクションは正しく適用されます。
以上が同じクラス内からメソッドを呼び出すときに Spring @Transactional アノテーションが機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。