Sobes.tech
Back to questions
Junior — Middle
62

Если метод, помеченный аннотацией @Transactional, вызывает другой метод с той же аннотацией, каково будет число созданных транзакций?

Answer from AI

sobes.tech AI

Если метод, помеченный аннотацией @Transactional, вызывает другой метод с той же аннотацией в рамках одного класса, то обычно создаётся только одна транзакция. Это связано с тем, что Spring использует прокси для управления транзакциями, и вызов метода внутри того же класса не проходит через прокси, поэтому новая транзакция не создаётся.

Таким образом, при внутреннем вызове транзакция будет общей для обоих методов, и не будет вложенных транзакций по умолчанию.

Пример:

@Service
public class MyService {

    @Transactional
    public void methodA() {
        // транзакция начинается здесь
        methodB(); // вызов внутри класса, новая транзакция не создаётся
    }

    @Transactional
    public void methodB() {
        // выполняется в той же транзакции, что и methodA
    }
}

Если нужно, чтобы метод methodB выполнялся в отдельной транзакции, вызов должен происходить через прокси, например, через другой бин или с помощью ApplicationContext.