Skip to content
Preptima
mediumConceptScenarioMidSenior

Why does @Transactional sometimes do nothing at all, even though the annotation is right there?

Spring applies @Transactional through a proxy that wraps the bean. Calling the annotated method from another method of the same class goes through `this`, not the proxy, so the advice never runs and no transaction is started. The same silence affects @Cacheable, @Async and @Retryable. It also connects dependency injection to the point an interviewer is testing.

4 min readUpdated 2026-08-15

Answer

Short answer

@Transactional does nothing on self-invocation because the call goes through this, not through the Spring proxy that applies transaction advice. Move the transactional method to another bean or call through the proxy deliberately, because private methods, same-class calls and similar proxy bypasses also affect @Async, @Cacheable and @Retryable.

Was this answer helpful?

Likely follow-ups

  • At what point in the bean lifecycle does the proxy get created, and what does that mean for @PostConstruct?
  • Why is @Transactional on a private method ignored under proxying but honoured under AspectJ weaving?
  • When does Spring use a JDK dynamic proxy instead of a CGLIB subclass, and what breaks with each?
  • Why did Spring Boot start rejecting circular bean references by default?

Related questions

Further reading