Sobes.tech
Junior — Middle

How does a method annotated with @Transactional behave when called inside another method with the same annotation?

sobes.tech AI

Answer from AI

In Spring Framework, the @Transactional annotation works through proxies that wrap method calls to manage transactions. If a method annotated with @Transactional calls another @Transactional method within the same class directly (i.e., through this), the proxy does not intercept this internal call, and the annotation on the internal method will not work separately.

This means that if the outer method has already started a transaction, the inner method will execute within the same transaction, and its own @Transactional settings (such as propagation or isolation) will not be applied.

However, if the call is made through a proxy (for example, from another bean), then the @Transactional settings of the internal method will be considered.

Example:

@Service
public class MyService {

    @Transactional
    public void outerMethod() {
        // transaction starts here
        innerMethod(); // direct call, proxy will not intercept
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void innerMethod() {
        // this method will not open a new transaction when called from outerMethod
    }
}

To make the internal method work with a separate transaction, it needs to be called through a proxy, for example, by injecting the bean itself and calling through it.

How does a method annotated with @Transactional… - sobes.tech