Ответ вслух Senior Транзакции и @Transactional обновлено

Когда нужен REQUIRES_NEW

Вопрос

Приведите реальные случаи для REQUIRES_NEW и NESTED. Какие у них риски?

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

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

Коротко

REQUIRESNEW использую, когда запись должна пережить откат основной операции: журнал попыток оплаты, аудит действий, счётчик ошибок. Метод выношу в отдельный бин, иначе прокси не сработает.

Что должно прозвучать в ответе

  • REQUIRES_NEW: аудит и журнал ошибок, которые должны сохраниться при откате

  • REQUIRES_NEW занимает второе соединение: риск исчерпания пула

  • Внутренняя транзакция не видит незакоммиченные изменения внешней

  • NESTED: savepoint для частичного отката внутри одной транзакции

  • Оба не работают при вызове через this

Что могут спросить следом

  • Почему NESTED не всегда поддерживается?
  • Как сохранить лог ошибки, не используя REQUIRES_NEW?

Разбор

REQUIRES_NEW использую, когда запись должна пережить откат основной операции: журнал попыток оплаты, аудит действий, счётчик ошибок. Метод выношу в отдельный бин, иначе прокси не сработает. Риски: новая транзакция берёт второе соединение, пока первое приостановлено, и при маленьком пуле под нагрузкой можно получить дедлок пула; кроме того, внутренняя транзакция не видит незакоммиченных изменений внешней и может упереться в её блокировки строк. NESTED это savepoint в той же транзакции: при ошибке откатывается только вложенная часть, например обработка одной строки из пакета. Он работает через JDBC savepoint и не везде поддерживается, а с JPA объекты в памяти не откатываются. Иногда проще вообще обойтись без вложенности: записать лог после отката отдельным вызовом снаружи транзакции.

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

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