Встречается на собеседованиях • сегодня

Что произойдет при вызове методом без @Transactional метода с @Transactional

При вызове метода без @Transactional метода с @Transactional поведение зависит от контекста:

  1. Если вызывается метод внутри одного класса - аннотация @Transactional не сработает, так как Spring AOP использует проксирование, а самовызовы не проходят через прокси. Транзакция не будет создана.
java
@Service
public class MyService {
    public void outerMethod() {
        innerMethod(); // транзакция НЕ создастся
    }
    
    @Transactional
    public void innerMethod() {
        // работа с БД
    }
}
  1. Если вызов идет между разными бинами - транзакция создастся нормально, так как вызов идет через Spring Proxy.
java
@Service
public class ServiceA {
    private final ServiceB serviceB;
    
    public void outerMethod() {
        serviceB.innerMethod(); // транзакция создастся
    }
}

@Service
public class ServiceB {
    @Transactional
    public void innerMethod() {
        // работа с БД
    }
}

Для корректной работы транзакций внутри одного класса можно:

  • Вынести транзакционный метод в отдельный сервис
  • Использовать self инъекцию через @Autowired
  • Использовать TransactionTemplate программное управление транзакциями
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы