controller 단에서의 transaction
- 작성자 :
- 이*진
- 작성일 :
- 2014-06-26 19:12:53
- 조회수 :
- 1,475
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
controller에서 2개의 서비스 메소드를 호출하여 각기 다른 데이타를 저장합니다.
controller 메소드에서 트랜젝션 처리를 할려고 하는데 rollback처리가 안 되는 것 같습니다.
transaction아래와 같이 설정하였습니다.
<tx:annotation-driven transaction-manager="txManager" />
<!-- transaction 설정 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
Controller 메소드는
@Transactional
public void updateXXX(....) throw Exception{
try{
aService.update();
bService.update();
}catch(Exception e){
log.error(e);
throw e;
}
그리고 각각의 service 클래스에 @Transactional, 해당 Mapper 인터페이스에도 @Transactional로 선언.
어떻게 하면 controller 메소드에서 transaction을 처리할 수 있는지요?
}
controller 메소드에서 트랜젝션 처리를 할려고 하는데 rollback처리가 안 되는 것 같습니다.
transaction아래와 같이 설정하였습니다.
<tx:annotation-driven transaction-manager="txManager" />
<!-- transaction 설정 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
Controller 메소드는
@Transactional
public void updateXXX(....) throw Exception{
try{
aService.update();
bService.update();
}catch(Exception e){
log.error(e);
throw e;
}
그리고 각각의 service 클래스에 @Transactional, 해당 Mapper 인터페이스에도 @Transactional로 선언.
어떻게 하면 controller 메소드에서 transaction을 처리할 수 있는지요?
}
A
안녕하세요. 이용진님.
Spring MVC Controller에서 Spring AOP 및 @Transactional 어노테이션을 사용 하시는 경우에는
기본적으로 Spring AOP는 다이나믹 프록시 방식을 사용하기 때문에 AOP가 동작하기 위해서는 인터페이스가 필요합니다.
그런 이유로 인터페이스를 가지고 있지 않은 Controller이 아닌 Service 클래스를 이용하여 트랜잭션 처리를 하고 있습니다.
인터페이스방식이 아닌 Controller 클래스를 이용하여 @Transactional 어노테이션을 적용하기 위해서는 스프링이 지원하는 클래스 프록시 모드를 사용하셔야 합니다.
따라서 application context에 다음과 같은 추가 설정이 필요합니다.
<annotation-driven>proxy-target-class="true"/></annotation-driven>
그럼 오늘도 좋은하루 보내시기 바랍니다.
감사합니다.
Spring MVC Controller에서 Spring AOP 및 @Transactional 어노테이션을 사용 하시는 경우에는
기본적으로 Spring AOP는 다이나믹 프록시 방식을 사용하기 때문에 AOP가 동작하기 위해서는 인터페이스가 필요합니다.
그런 이유로 인터페이스를 가지고 있지 않은 Controller이 아닌 Service 클래스를 이용하여 트랜잭션 처리를 하고 있습니다.
인터페이스방식이 아닌 Controller 클래스를 이용하여 @Transactional 어노테이션을 적용하기 위해서는 스프링이 지원하는 클래스 프록시 모드를 사용하셔야 합니다.
따라서 application context에 다음과 같은 추가 설정이 필요합니다.
<annotation-driven>proxy-target-class="true"/></annotation-driven>
그럼 오늘도 좋은하루 보내시기 바랍니다.
감사합니다.