복붙노트

[SPRING] @Transactional을 말할 때마다 체크 된 모든 예외에서 롤백

SPRING

@Transactional을 말할 때마다 체크 된 모든 예외에서 롤백

프로그래머가 검사 된 모든 예외를 포착해야하기 때문에 문제가 발생하면 검사 예외가 발생합니다. 그 중 하나를 롤백하고 싶습니다. 모든 @Transactional 주석에 대해 rollbackFor = Exception.class를 작성하는 것은 오류가 발생하기 쉽기 때문에 봄에 "@Transactional을 작성할 때마다 @Transactional (rollbackFor = Exception.class)"을 의미한다고 말하고 싶습니다.

알아요. 맞춤 주석을 만들 수 있지만 부 자연스럽게 보입니다.

그렇다면 봄에 확인 된 예외를 어떻게 처리해야 하는지를 알려주는 방법이 있습니까?

해결법

  1. ==============================

    1.아니요, 이것은 사용자 정의 주석의 사용 사례입니다. Spring Reference의 Custom Shortcut Annotations에서 인용 한 내용은 다음과 같습니다.

    아니요, 이것은 사용자 정의 주석의 사용 사례입니다. Spring Reference의 Custom Shortcut Annotations에서 인용 한 내용은 다음과 같습니다.

    다음은 유스 케이스에 대한 샘플 주석입니다.

    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Transactional(rollbackFor=Exception.class)
    public @interface MyAnnotation {
    }
    

    이제 @MyAnnotation을 사용하여 서비스 및 / 또는 메소드에 주석을 추가하십시오 (더 나은 이름을 생각해보십시오). 이것은 기본적으로 작동하는 잘 테스트 된 기능입니다. 왜 바퀴를 다시 발명합니까?

  2. ==============================

    2.사용자 정의 주석을 사용한 접근 방식은 훌륭하고 간단하지만 실제로 사용하지 않으려는 경우 사용자 정의 TransactionAttributeSource를 만들어 @Transactional의 해석을 수정할 수 있습니다.

    사용자 정의 주석을 사용한 접근 방식은 훌륭하고 간단하지만 실제로 사용하지 않으려는 경우 사용자 정의 TransactionAttributeSource를 만들어 @Transactional의 해석을 수정할 수 있습니다.

    public class RollbackForAllAnnotationTransactionAttributeSource 
        extends AnnotationTransactionAttributeSource {
        @Override
        protected TransactionAttribute determineTransactionAttribute(
                AnnotatedElement ae) {
            TransactionAttribute target = super.determineTransactionAttribute(ae);
            if (target == null) return null;
            else return new DelegatingTransactionAttribute(target) {
                @Override
                public boolean rollbackOn(Throwable ex) {
                    return true;
                }
            };
        }
    }
    

    대신 다음과 같이 수동으로 설정하십시오 (AnnotationDrivenBeanDefinitionParser 소스 참조) :

    <bean id = "txAttributeSource"
        class = "RollbackForAllAnnotationTransactionAttributeSource" />
    
    <bean id = "txInterceptor"
        class = "org.springframework.transaction.interceptor.TransactionInterceptor">
        <property name = "transactionManagerBeanName" value = "transactionManager" />
        <property name = "transactionAttributeSource" ref = "txAttributeSource" />
    </bean>
    
    <bean
        class = "org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor">
        <property name="transactionAttributeSource" ref = "txAttributeSource" />
        <property name = "adviceBeanName" value = "txInterceptor" />
    </bean>
    

    또한 또는 가 필요합니다.

    그러나 이러한 재정의는 @Transactional의 정상적인 동작을 기대하는 다른 개발자에게 혼동을 줄 수 있습니다.

  3. ==============================

    3.할 수있는 일 :

    할 수있는 일 :

  4. ==============================

    4.다음과 같이 메서드 이름을 기반으로 트랜잭션 조언을 구성 할 수 있습니다. (스프링 2.0 문서에서)

    다음과 같이 메서드 이름을 기반으로 트랜잭션 조언을 구성 할 수 있습니다. (스프링 2.0 문서에서)

    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
          <tx:method name="get*" read-only="false" rollback-for="NoProductInStockException"/>
          <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>
    
  5. from https://stackoverflow.com/questions/3701376/rollback-on-every-checked-exception-whenever-i-say-transactional by cc-by-sa and MIT license