복붙노트

[SPRING] 왜 @Scheduled 주석은 @Transaction 주석과 함께 작동하지 않습니다. 봄 부츠

SPRING

왜 @Scheduled 주석은 @Transaction 주석과 함께 작동하지 않습니다. 봄 부츠

나는 질문이있다 : @Scheduled와 @Transaction을 사용하여 메소드에 주석을 추가하면 트랜잭션이 작동하지 않는 이유는 무엇입니까? 나는 @Scheduled가 Spring에 의해 생성 된 프록시 클래스 대신에 내 클래스를 호출하지만이 동작을 이해할 수 없다는 것을 안다.

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserServiceImpl implements UserService {

    @Override
    @Scheduled(fixedRateString = "${somestring}",initialDelayString = "${anotherstring}")
    @Transactional
    public void doSomething() {

        }
    }

이 문제의 두 가지 해결책이 있습니다.

그러나이 솔루션은 매우 불편합니다.

@Scheduled가 왜 이렇게 작동하는지 설명해 주시겠습니까?

고맙습니다!

해결법

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

    1.둘 다 주석을 처리하기 때문에 MAGIC이 사용됩니다.

    둘 다 주석을 처리하기 때문에 MAGIC이 사용됩니다.

    몇 가지 일이 발생한다고 가정합니다.

    2 단계와 3 단계가 다른 순서로 진행되면 문제가 없습니다.

    주석을 처리하는 순서를 제어하는 ​​방법을 알지 못합니다. 나는 그것이 가능하다는 것을 전혀 확신하지 못한다.

    기본적으로 두 가지 해결책이 있습니다.

    예:

    @Service
    public class UserServiceImpl implements UserService {
    
        @Override
        @Transactional
        public void doSomething() {
    
        }
    }
    
    @Service
    public class UserServiceScheduler {
    
        @Inject
        private UserService service;
    
        @Scheduled(fixedRateString = "${somestring}",initialDelayString = "${anotherstring}")
        public void doSomething() {
             service.doSomething();
        }
    }
    

    저는 개인적으로 두 번째 방법을 권장합니다.

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

    2.질문은 비공개 또는 공개가 아닙니다. 문제는 어떻게 호출되며 사용하는 AOP 구현입니다!

    질문은 비공개 또는 공개가 아닙니다. 문제는 어떻게 호출되며 사용하는 AOP 구현입니다!

    (기본값) Spring Proxy AOP를 사용한다면 Spring이 제공하는 모든 AOP 기능 (예 : @Transational)은 호출이 프록시를 거치는 경우에만 고려됩니다. - 일반적으로 어노테이션 된 메소드가 다른 bean에서 호출되는 경우입니다.

    여기에는 두 가지 의미가 있습니다.

    Spring Proxies 대신 aspectJ 모드를 사용하여 문제를 극복 할 수 있습니다. AspectJ Transactional Aspects는 개인적인 방법으로 짜여져있다 (Spring 3.0에서 확인).

    다음을 참조하십시오 : http://docs.spring.io/spring/docs/3.2.4.RELEASE/spring-framework-reference/html/aop.html#aop-proxying

  3. from https://stackoverflow.com/questions/45355601/why-scheduled-annotation-doesnt-work-with-transaction-annotation-spring-boot by cc-by-sa and MIT license