Выбор ответа Senior Транзакции и @Transactional обновлено
REQUIRES_NEW и пул соединений
Вопрос
Каждый запрос в транзакции вызывает метод другого бина с REQUIRES_NEW. Пул соединений 10, одновременно приходит 10 запросов. Что может случиться?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Дедлок пула: каждой транзакции нужно второе соединение. REQUIRESNEW приостанавливает текущую транзакцию, но её соединение остаётся занятым, а для новой нужно второе.
Варианты ответа
- Ничего: REQUIRES_NEW использует то же соединение
- Внутренние транзакции просто выполнятся последовательно
- Spring автоматически увеличит пул под вложенные транзакции
- Дедлок пула: каждой транзакции нужно второе соединениеправильный ответ
Разбор
REQUIRES_NEW приостанавливает текущую транзакцию, но её соединение остаётся занятым, а для новой нужно второе. Если все соединения уже держат внешние транзакции, внутренние ждут свободного соединения вечно (до connectionTimeout). Решения: пул больше, чем максимум одновременных вложенностей, меньше REQUIRES_NEW, вынести работу после коммита.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.