When using Spring proxies, calling a method in the same class (e.g. this.aMethod()) with an incompatible @Transactional
requirement will result in runtime exceptions because Spring only "sees" the caller and makes no provisions for properly invoking the callee.
Therefore, certain calls should never be made within the same class:
| 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(); // Noncompliant
}
@Override
@Transactional
public void actuallyDoTheThing() {
// ...
}