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

REQUIRES_NEW и пул соединений

Вопрос

Каждый запрос в транзакции вызывает метод другого бина с REQUIRES_NEW. Пул соединений 10, одновременно приходит 10 запросов. Что может случиться?

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

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

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

Коротко

Правильный ответ: Дедлок пула: каждой транзакции нужно второе соединение. REQUIRESNEW приостанавливает текущую транзакцию, но её соединение остаётся занятым, а для новой нужно второе.

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

  1. Ничего: REQUIRES_NEW использует то же соединение
  2. Внутренние транзакции просто выполнятся последовательно
  3. Spring автоматически увеличит пул под вложенные транзакции
  4. Дедлок пула: каждой транзакции нужно второе соединениеправильный ответ

Разбор

REQUIRES_NEW приостанавливает текущую транзакцию, но её соединение остаётся занятым, а для новой нужно второе. Если все соединения уже держат внешние транзакции, внутренние ждут свободного соединения вечно (до connectionTimeout). Решения: пул больше, чем максимум одновременных вложенностей, меньше REQUIRES_NEW, вынести работу после коммита.

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

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