Выбор ответа Junior Транзакции и @Transactional спрашивают часто обновлено

@Transactional на private-методе

Вопрос

Что будет с @Transactional private void recalc(), вызываемым из публичного метода того же класса?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Не сработает: метод private и вызов через this, прокси мимо. Транзакции открывает прокси, а он не видит ни private-методы, ни вызовы через this.

Варианты ответа

  1. Транзакция откроется: Spring проксирует и private-методы
  2. Не сработает: метод private и вызов через this, прокси мимоправильный ответ
  3. Ошибка при старте контекста из-за private-метода
  4. Транзакция откроется только при вызове из другого бина

Разбор

Транзакции открывает прокси, а он не видит ни private-методы, ни вызовы через this. Ошибки при старте нет, IDE может предупредить. Даже из другого бина private-метод не вызвать. Нужно сделать метод публичным и вынести в отдельный бин или открыть транзакцию на публичном методе снаружи.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.