問題:
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 サイトの他の関連記事を参照してください。