같은 클래스 내의 메소드에서 호환되지 않는 "@Transactional" 메소드를 호출하지 않아야 합니다.

 

스프링 프록시를 사용할 때, 같은 클래스 내에서 호환되지 않는 다른 “@Transactional” 메소드를 호출하는 경우(this.aMethod() 처럼), 런타임 에러가 발생할 수 있습니다.
이것은 스프링이 오직 메소드의 호출자(caller)만을 보고 있으며, 피호출자(callee)를 위한 적절한 설정을 생성할 수 없기 때문입니다.

그러므로, 아래와 같이 동일한 클래스 내에서 특정한 경우에 대해 메소드가 다른 메소드를 호출해서는 안됩니다.

From To
non-@Transactional MANDATORY, NESTED, REQUIRED, REQUIRES_NEW
MANDATORY NESTED, NEVER, NOT_SUPPORTED, REQUIRES_NEW
NESTED NESTED, NEVER, NOT_SUPPORTED, REQUIRES_NEW
NEVER MANDATORY, NESTED, REQUIRED, REQUIRES_NEW
NOT_SUPPORTED MANDATORY, NESTED, REQUIRED, REQUIRES_NEW
REQUIRED or @Transactional NESTED, NEVER, NOT_SUPPORTED, REQUIRES_NEW
REQUIRES_NEW NESTED, NEVER, NOT_SUPPORTED, REQUIRES_NEW
SUPPORTS MANDATORY, NESTED, NEVER, NOT_SUPPORTED, REQUIRED, REQUIRES_NEW

규칙을 어긴 코드

@Override
public void doTheThing() {
// ...
actuallyDoTheThing();  // 규칙을 어긴 코드
}

@Override
@Transactional
public void actuallyDoTheThing() {
// ...
}

If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project