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