Встречается на собеседованиях • сегодня

Что делать при завершении ошибкой вложенной транзакции, если при вложенной транзакции внешняя приостанавливается

При ошибке во вложенной транзакции в Spring есть несколько вариантов:

  1. По умолчанию вложенная транзакция создает savepoint. При ошибке откатывается только до этого savepoint, внешняя транзакция продолжается.

  2. Если нужно откатить всю транзакцию, используйте @Transactional(propagation = Propagation.REQUIRED) (по умолчанию) и пробросьте исключение:

java
@Transactional
public void outerMethod() {
    // внешняя транзакция
    try {
        innerMethod(); // вложенная транзакция
    } catch (Exception e) {
        // транзакция будет откачена полностью
    }
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void innerMethod() {
    // код, который может упасть
    throw new RuntimeException("Error");
}
  1. Для управления поведением можно использовать TransactionTemplate с явным указанием поведения при ошибках.

Важно: при REQUIRES_NEW внешняя транзакция приостанавливается, а при ошибке во вложенной - откатывается только она. Внешняя транзакция продолжается, если не было исключения.

Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы