스프링 프록시를 사용할 때, 같은 클래스 내에서 호환되지 않는 다른 “@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.