Sobes.tech
Junior — Middle

Mi történik, ha egy @Transactional annotációval ellátott metódust hívunk meg egy olyan metóduson belül, amely nem rendelkezik ezzel az annotációval Springben?

sobes.tech MI

Válasz az MI-től

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

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

Пример:

@Service
public class MyService {

    public void outerMethod() {
        // Вызов внутреннего метода не создаст транзакцию
        innerTransactionalMethod();
    }

    @Transactional
    public void innerTransactionalMethod() {
        // Здесь транзакция не будет активна, если вызов из outerMethod
    }
}