Transaction 특정 메소드 비활성화 방법
- 작성자 :
- 김*지
- 작성일 :
- 2024-11-05 17:05:55
- 조회수 :
- 222
- 구분 :
- 개발환경 / 3.9
- 진행상태 :
- 완료
Q
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="requiredTx" expression="execution(* project.service..impl.*Impl.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />
</aop:config>
위와 같이 context-transaction.xml 이 설정되어 있을때
@Transactional 을 붙이지 않은 메소드에도 Exception 이 발생하면 트랜잭션이 적용됩니다.
@Transactional(propagation = Propagation.NEVER) 로 해도
뭘 해도 Exception 발생 시 트랜잭션이 발동해서, 해당 트랜잭션 특정 메소드는 비활성화 하는 방법이 궁금합니다.
(Exception 발동시 별도 처리 해야 하는 DB 로직이 있어서 구현이 필요합니다.)
<tx:attributes>
<tx:method name="*" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="requiredTx" expression="execution(* project.service..impl.*Impl.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />
</aop:config>
위와 같이 context-transaction.xml 이 설정되어 있을때
@Transactional 을 붙이지 않은 메소드에도 Exception 이 발생하면 트랜잭션이 적용됩니다.
@Transactional(propagation = Propagation.NEVER) 로 해도
뭘 해도 Exception 발생 시 트랜잭션이 발동해서, 해당 트랜잭션 특정 메소드는 비활성화 하는 방법이 궁금합니다.
(Exception 발동시 별도 처리 해야 하는 DB 로직이 있어서 구현이 필요합니다.)
환경정보
-
- OS 정보 : window11
- 표준프레임워크 버전 : 3.9
- JDK(JRE) 정보 : 1.8
- WAS 정보 : was
- DB 정보 : psql
- 기타 환경 정보 :
A
안녕하세요.
표준프레임워크 센터입니다.
첨부하여 주신 설정에서는
context-transaction.xml에서
<tx:method name="*" rollback-for="Exception"/> 설정으로 인하여
트랜잭션이 모든 메서드에 전역적으로 적용되도록 한 것으로 확인됩니다.
XML 기반 설정을 제거하고 각 메서드에 명시적으로 트랜잭션을 지정하는 방식으로 수정 또는
Pointcut을 수정하여 특정 클래스 또는 패키지만 트랜잭션을 적용하는 방법을 고려할 수 있을 것으로 보입니다.
현재 Pointcut의 조건으로 project.service..impl 패키지에
*Impl로 끝나는 클래스에 걸리므로
다른 패키지 위치에 클래스를 생성하거나
또는 Impl로 끝나지 않는 클래스를 생성하여 처리하실수 있을듯 합니다.
상세한 사항은 해당 위키 페이지를 참고하실 수 있습니다.
https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte:psl:transaction:declarative_transaction_management
감사합니다.
표준프레임워크 센터입니다.
첨부하여 주신 설정에서는
context-transaction.xml에서
<tx:method name="*" rollback-for="Exception"/> 설정으로 인하여
트랜잭션이 모든 메서드에 전역적으로 적용되도록 한 것으로 확인됩니다.
XML 기반 설정을 제거하고 각 메서드에 명시적으로 트랜잭션을 지정하는 방식으로 수정 또는
Pointcut을 수정하여 특정 클래스 또는 패키지만 트랜잭션을 적용하는 방법을 고려할 수 있을 것으로 보입니다.
현재 Pointcut의 조건으로 project.service..impl 패키지에
*Impl로 끝나는 클래스에 걸리므로
다른 패키지 위치에 클래스를 생성하거나
또는 Impl로 끝나지 않는 클래스를 생성하여 처리하실수 있을듯 합니다.
상세한 사항은 해당 위키 페이지를 참고하실 수 있습니다.
https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte:psl:transaction:declarative_transaction_management
감사합니다.