문제:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!