Sobes.tech
Назад к вопросам
Junior — Middle
65

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

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

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

Это означает, что если внешний метод уже запустил транзакцию, то внутренний метод будет выполняться в рамках той же транзакции, и его собственные настройки @Transactional (например, propagation или isolation) не применятся.

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

Пример:

@Service
public class MyService {

    @Transactional
    public void outerMethod() {
        // транзакция начинается здесь
        innerMethod(); // вызов напрямую, прокси не сработает
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void innerMethod() {
        // этот метод не откроет новую транзакцию при вызове из outerMethod
    }
}

Чтобы внутренний метод сработал с отдельной транзакцией, нужно вызывать его через прокси, например, через внедрение самого бина MyService и вызов через него.