Выбор ответа Middle Транзакции и @Transactional обновлено
UnexpectedRollbackException
Вопрос
outer() с @Transactional вызывает inner() другого бина, тоже @Transactional (REQUIRED). inner() бросает RuntimeException, outer() его ловит и завершается нормально. Что получит вызывающий outer()?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: UnexpectedRollbackException: транзакция помечена rollback-only. При REQUIRED inner() присоединился к транзакции outer().
Варианты ответа
- Успех: исключение поймано, изменения outer() закоммитятся
- Закоммитятся изменения outer(), а изменения inner() откатятся
- RuntimeException из inner(), проброшенный прокси outer()
- UnexpectedRollbackException: транзакция помечена rollback-onlyправильный ответ
Разбор
При REQUIRED inner() присоединился к транзакции outer(). Когда исключение вышло через прокси inner(), тот пометил общую транзакцию rollback-only. outer() поймал исключение, но при попытке коммита менеджер видит метку, откатывает всё и бросает UnexpectedRollbackException. Частично откатить только inner() можно через NESTED (savepoint) или REQUIRES_NEW.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.