Выбор ответа Middle Транзакции и @Transactional обновлено

UnexpectedRollbackException

Вопрос

outer() с @Transactional вызывает inner() другого бина, тоже @Transactional (REQUIRED). inner() бросает RuntimeException, outer() его ловит и завершается нормально. Что получит вызывающий outer()?

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

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

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

Коротко

Правильный ответ: UnexpectedRollbackException: транзакция помечена rollback-only. При REQUIRED inner() присоединился к транзакции outer().

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

  1. Успех: исключение поймано, изменения outer() закоммитятся
  2. Закоммитятся изменения outer(), а изменения inner() откатятся
  3. RuntimeException из inner(), проброшенный прокси outer()
  4. UnexpectedRollbackException: транзакция помечена rollback-onlyправильный ответ

Разбор

При REQUIRED inner() присоединился к транзакции outer(). Когда исключение вышло через прокси inner(), тот пометил общую транзакцию rollback-only. outer() поймал исключение, но при попытке коммита менеджер видит метку, откатывает всё и бросает UnexpectedRollbackException. Частично откатить только inner() можно через NESTED (savepoint) или REQUIRES_NEW.

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

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