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

REQUIRES_NEW через this

Вопрос

Метод process() с @Transactional вызывает this.saveAudit(), помеченный @Transactional(propagation = REQUIRES_NEW). Затем process() падает с RuntimeException. Сохранится ли запись аудита?

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

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

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

Коротко

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

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

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

Разбор

Атрибуты транзакции применяет прокси. Внутренний вызов идёт напрямую, аннотация на saveAudit игнорируется, и запись попадает в транзакцию process(), которая откатывается. public тут не поможет. Нужно вынести saveAudit в отдельный бин, тогда REQUIRES_NEW откроет независимую транзакцию с отдельным коммитом.

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

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