Выбор ответа Junior AOP и прокси спрашивают часто обновлено

Вызов @Transactional-метода из того же класса

Вопрос

Контроллер вызывает orderService.placeAll(list), а placeAll (без аннотаций) в цикле вызывает this.place(o), помеченный @Transactional. Будет ли транзакция у place?

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

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

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

Коротко

Правильный ответ: Нет: вызов через this идёт мимо прокси. Транзакцию открывает прокси, а внутри placeAll код уже выполняется на настоящем объекте, и this.place() это обычный Java-вызов.

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

  1. Нет: вызов через this идёт мимо проксиправильный ответ
  2. Да: аннотация на методе работает всегда
  3. Да, одна общая на весь цикл
  4. Нет, и Spring выбросит исключение при старте

Разбор

Транзакцию открывает прокси, а внутри placeAll код уже выполняется на настоящем объекте, и this.place() это обычный Java-вызов. Аннотация молча игнорируется, исключения при старте нет. Решения: вынести place в отдельный бин, вызывать через внедрённую ссылку на себя или использовать TransactionTemplate. Общая транзакция была бы, если бы @Transactional стоял на placeAll.

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

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

Термины по теме