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