Выбор ответа Middle Транзакции и @Transactional спрашивают часто обновлено
REQUIRES_NEW через this
Вопрос
Метод process() с @Transactional вызывает this.saveAudit(), помеченный @Transactional(propagation = REQUIRES_NEW). Затем process() падает с RuntimeException. Сохранится ли запись аудита?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Нет: вызов через this минует прокси, аудит откатится. Атрибуты транзакции применяет прокси.
Варианты ответа
- Да: REQUIRES_NEW всегда создаёт отдельную транзакцию
- Да, но только если метод saveAudit объявлен public
- Нет: вызов через this минует прокси, аудит откатитсяправильный ответ
- Нет, и Spring выбросит исключение о вложенной транзакции
Разбор
Атрибуты транзакции применяет прокси. Внутренний вызов идёт напрямую, аннотация на saveAudit игнорируется, и запись попадает в транзакцию process(), которая откатывается. public тут не поможет. Нужно вынести saveAudit в отдельный бин, тогда REQUIRES_NEW откроет независимую транзакцию с отдельным коммитом.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.