>Java >java지도 시간 >Spring의 동일한 클래스 내에서 자체 호출될 때 @Transactional 메서드가 실패하는 이유는 무엇입니까?

Spring의 동일한 클래스 내에서 자체 호출될 때 @Transactional 메서드가 실패하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-19 04:47:09381검색

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

동일 클래스 내 트랜잭션 메서드 호출 문제

문제:

Spring에서 @동일 클래스 내 트랜잭션은 비효율적일 수 있습니다. 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:

    <tx:annotation-driven mode="aspectj"/>
  • 다음 Bean 구성 추가(전용)에서 modej로 모드 설정 아래는 봄 버전 3.0):

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

리팩토링:

대안 솔루션은 코드를 리팩터링하는 것입니다. 동일한 클래스 내에서 트랜잭션 메서드를 호출하는 대신 Spring AOP를 사용하여 기본 트랜잭션 처리를 활성화하려면 사용자 처리 및 처리를 위한 별도의 클래스를 생성하는 것이 좋습니다.

위 내용은 Spring의 동일한 클래스 내에서 자체 호출될 때 @Transactional 메서드가 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.