[재질문]트랜잭션 분리를 위한 Propagation.REQUIRES_NEW 사용에 대하여
- 작성자 :
- 김*수
- 작성일 :
- 2014-01-02 19:27:00
- 조회수 :
- 1,566
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
오늘 올린 질문에 대한 답변에 대해 재질문을 올립니다.
답변하신 것 처럼
<tx:method name="processProc*" propagation="REQUIRES_NEW" rollback-for="Exception"/>
를 추가했지만 동일한 오류가 나타납니다.
그리고, context-transaction에 다음과 같이 설정하고
<tx:method name="*" rollback-for="Exception"/>
각 메소드에서 필요한 경우 @Transactional(propagation=Propagation.REQUIRES_NEW)로 선언하여 사용하고 있습니다.
이 부분이 잘못된 것은 아니므로 답변하신 것 처럼 해도 동일한 결과가 나오는 것 같습니다.
현상을 정리하면,
Service A에서 REQUIRES_NEW로 선언된 Service B를 호출한 경우
1)Service B가 정상처리되고, Service A에서 Exception이 발생하면 Service B는 커밋되고, Service A가 rollback 처리 됩니다. 이 부분은 정상적으로 동작합니다.
2)Service B가 Exception 발생하고, Service A에서 이를 try catch로 무시하고 계속 진행하여 정상처리하면 모두 rollback처리 됩니다.
저의 목적은 Service B만 Rollback 처리되고, Service A는 커밋되기를 원한 것입니다. (이는 업무상 특이한 상황이 있어서 입니다).
이는 AbstractPlatformTransactionManager에서 globalRollbackOnParticipationFailure이 true로 되어 있어서 인듯 한데요,
이 설정을 변경하거나 또는 다른 방법이 없나요?
다시 한번 조언을 부탁드립니다.
답변하신 것 처럼
<tx:method name="processProc*" propagation="REQUIRES_NEW" rollback-for="Exception"/>
를 추가했지만 동일한 오류가 나타납니다.
그리고, context-transaction에 다음과 같이 설정하고
<tx:method name="*" rollback-for="Exception"/>
각 메소드에서 필요한 경우 @Transactional(propagation=Propagation.REQUIRES_NEW)로 선언하여 사용하고 있습니다.
이 부분이 잘못된 것은 아니므로 답변하신 것 처럼 해도 동일한 결과가 나오는 것 같습니다.
현상을 정리하면,
Service A에서 REQUIRES_NEW로 선언된 Service B를 호출한 경우
1)Service B가 정상처리되고, Service A에서 Exception이 발생하면 Service B는 커밋되고, Service A가 rollback 처리 됩니다. 이 부분은 정상적으로 동작합니다.
2)Service B가 Exception 발생하고, Service A에서 이를 try catch로 무시하고 계속 진행하여 정상처리하면 모두 rollback처리 됩니다.
저의 목적은 Service B만 Rollback 처리되고, Service A는 커밋되기를 원한 것입니다. (이는 업무상 특이한 상황이 있어서 입니다).
이는 AbstractPlatformTransactionManager에서 globalRollbackOnParticipationFailure이 true로 되어 있어서 인듯 한데요,
이 설정을 변경하거나 또는 다른 방법이 없나요?
다시 한번 조언을 부탁드립니다.
A
안녕하세요. 김기수님.
AOP 방식(pointcut 정의 후, <tx:advice../> 사용)과 Annoation 기반(@Transactional)은 동시에 사용하실 수 없습니다.
@Transactonal을 사용하시는 경우라면, 설정 파일 중에 다음과 같은 annotation-driven 설정을 포함하고 있어야 합니다.
<tx:annotation-driven transaction-manager="txManager"/>
이 경우는 대상이 되는 모든 메소드 상에 @Transactonal를 추가해 놓으셔야 하기 때문에, 이 방식보다는 AOP 상에 조치 방법을 설명 드린 것입니다.
추가로 AOP 상에 transaction 설정이 반영되지 않는 경우는 pointcut 정의가 잘못되었거나, 서비스 호출 부분 상의 ApplicationContext가 아닌 다른 곳에서 정의되었기 때문입니다.
이 부분 다시 확인해 보십시오.
그럼, 즐거운 하루되십시오.
감사합니다.
AOP 방식(pointcut 정의 후, <tx:advice../> 사용)과 Annoation 기반(@Transactional)은 동시에 사용하실 수 없습니다.
@Transactonal을 사용하시는 경우라면, 설정 파일 중에 다음과 같은 annotation-driven 설정을 포함하고 있어야 합니다.
<tx:annotation-driven transaction-manager="txManager"/>
이 경우는 대상이 되는 모든 메소드 상에 @Transactonal를 추가해 놓으셔야 하기 때문에, 이 방식보다는 AOP 상에 조치 방법을 설명 드린 것입니다.
추가로 AOP 상에 transaction 설정이 반영되지 않는 경우는 pointcut 정의가 잘못되었거나, 서비스 호출 부분 상의 ApplicationContext가 아닌 다른 곳에서 정의되었기 때문입니다.
이 부분 다시 확인해 보십시오.
그럼, 즐거운 하루되십시오.
감사합니다.