트랜잭션 분리를 위한 Propagation.REQUIRES_NEW 사용에 대하여
- 작성자 :
- 김*수
- 작성일 :
- 2014-01-02 12:13:22
- 조회수 :
- 2,520
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
수고하십니다. 새해 복 많이 받으세요..
egov 2.5환경에서 개발을 진행하고 있습니다. 다음과 같은 호출 순서로 처리하고 있습니다.
1)Controller의 saveData
-->2) Service의 SaveData
-->2-1) 동일 클래스 내 private 함수 createData1 호출
-->2-1-1) 다른 Service의 processProc 호출 : 여기에 @Transactional(propagation=Propagation.REQUIRES_NEW) 선언
-->2-1-1-1) DAO 호출
-->2-2) 동일 클래스 내 private 함수 createData2 호출
-->2-2-1) DAO호출
2-1-1)의 트랜잭션을 분리하기 위해 Propagation.REQUIRES_NEW 선언하고 여기서 Exception이 나도 그 외의 데이터는 처리가 되도록하는 구성입니다.
그런데 전체가 rollback이 되는 현상이 나타나고 있습니다.
context-transaction에는 execution(* or.ato..service.*Impl.*(..))으로 설정되어 있습니다.
다음은 -2-1-1에서 Exception이 발생한 이후의 로그입니다.
2014-01-02 10:31:13,448 ERROR [org.springframework.transaction.interceptor.TransactionInterceptor:439] Application exception overridden by commit exception
egovframework.rte.fdl.cmmn.exception.EgovBizException: 오류가 발생되었습니다.
....
2014-01-02 10:31:13,455 ERROR [or.ato.aaa.cmmn.service.PoProcCallServiceImpl:135] Transaction rolled back because it has been marked as rollback-only
org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
....
2014-01-02 10:31:14,381 ERROR [or.ato.aaa.ppy.web.SvrpsTrnProcController:220] Transaction rolled back because it has been marked as rollback-only
잘못된 부분이 있는지 조언 부탁드립니다.
egov 2.5환경에서 개발을 진행하고 있습니다. 다음과 같은 호출 순서로 처리하고 있습니다.
1)Controller의 saveData
-->2) Service의 SaveData
-->2-1) 동일 클래스 내 private 함수 createData1 호출
-->2-1-1) 다른 Service의 processProc 호출 : 여기에 @Transactional(propagation=Propagation.REQUIRES_NEW) 선언
-->2-1-1-1) DAO 호출
-->2-2) 동일 클래스 내 private 함수 createData2 호출
-->2-2-1) DAO호출
2-1-1)의 트랜잭션을 분리하기 위해 Propagation.REQUIRES_NEW 선언하고 여기서 Exception이 나도 그 외의 데이터는 처리가 되도록하는 구성입니다.
그런데 전체가 rollback이 되는 현상이 나타나고 있습니다.
context-transaction에는 execution(* or.ato..service.*Impl.*(..))으로 설정되어 있습니다.
다음은 -2-1-1에서 Exception이 발생한 이후의 로그입니다.
2014-01-02 10:31:13,448 ERROR [org.springframework.transaction.interceptor.TransactionInterceptor:439] Application exception overridden by commit exception
egovframework.rte.fdl.cmmn.exception.EgovBizException: 오류가 발생되었습니다.
....
2014-01-02 10:31:13,455 ERROR [or.ato.aaa.cmmn.service.PoProcCallServiceImpl:135] Transaction rolled back because it has been marked as rollback-only
org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
....
2014-01-02 10:31:14,381 ERROR [or.ato.aaa.ppy.web.SvrpsTrnProcController:220] Transaction rolled back because it has been marked as rollback-only
잘못된 부분이 있는지 조언 부탁드립니다.
A
안녕하세요. 김기수님.
AOP 방식으로 적용하셨기 때문에 @Transactoinal 지정하신 부분이 적용되지 않은 것입니다.
이 경우는 다음과 같이 기존 advice에 method 설정을 추가하시면 되실 것 같습니다.
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="processProc*" propagation="REQUIRES_NEW" rollback-for="Exception"/>
<tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
이 설정은 호출 되는 메소드 이름이 "processProc"로 시작하는 경우에 propagation 설정을 지정하시는 방식입니다.
그럼, 즐거운 하루되십시오.
감사합니다.
AOP 방식으로 적용하셨기 때문에 @Transactoinal 지정하신 부분이 적용되지 않은 것입니다.
이 경우는 다음과 같이 기존 advice에 method 설정을 추가하시면 되실 것 같습니다.
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="processProc*" propagation="REQUIRES_NEW" rollback-for="Exception"/>
<tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
이 설정은 호출 되는 메소드 이름이 "processProc"로 시작하는 경우에 propagation 설정을 지정하시는 방식입니다.
그럼, 즐거운 하루되십시오.
감사합니다.