Что проверяет вопрос про propagation, кроме REQUIRES_NEW и NESTED

На собеседовании обычно спрашивают про REQUIRED, REQUIRES_NEW и NESTED — они самые частые в коде. Дальше идёт проверка, понимаете ли вы остальные значения enum Propagation, а не выучили ли три примера наизусть.

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

MANDATORY требует существующую транзакцию и кидает исключение, если её нет — используют там, где метод не должен вызываться сам по себе. NEVER требует отсутствие транзакции и кидает исключение, если она есть — редкий случай для операций, которые нельзя откатить вместе с остальным.

@Transactional(propagation = Propagation.MANDATORY) public void chargeCard(Order order) { // вызывается только внутри // транзакции checkout() }

Следующий вопрос обычно: что произойдёт, если вызвать MANDATORY-метод без транзакции. Правильный ответ — IllegalTransactionStateException в момент входа в метод, а не в момент коммита. Ещё спрашивают, приостанавливается ли физическая транзакция при NOT_SUPPORTED — да, Spring временно освобождает JDBC-соединение из ThreadLocal, чтобы вложенный код мог работать вне транзакционного контекста.

Propagation — это не про «новая транзакция или старая». Это про то, что должно случиться с транзакцией у вызывающего кода, когда вызывают ваш метод.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки