Sobes.tech
Назад к вопросам
Senior
4

Что такое @Transactional в Spring и что произойдёт если первый метод вызывает второй, оба помечены @Transactional?

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

Аннотация @Transactional в Spring обозначает, что метод должен выполняться в рамках транзакции. Если транзакция уже существует, метод будет выполнен в её контексте, иначе будет создана новая.

Если первый метод вызывает второй, и оба помечены @Transactional, то поведение зависит от настроек propagation (по умолчанию — REQUIRED):

  • Второй метод выполнится в рамках той же транзакции, что и первый (транзакция не создаётся заново).
  • Если первый метод откатит транзакцию, то изменения, сделанные во втором методе, тоже будут откатаны.

Важно: если вызов второго метода происходит внутри того же класса через обычный вызов (без прокси Spring), то аннотация @Transactional второго метода может не сработать, так как Spring использует прокси для управления транзакциями.

Пример:

@Transactional
public void firstMethod() {
    // операции
    secondMethod(); // вызов внутри того же класса
}

@Transactional
public void secondMethod() {
    // операции
}

В этом случае secondMethod не будет иметь отдельной транзакции, а выполнится в рамках транзакции firstMethod.

Если нужно, чтобы второй метод имел отдельную транзакцию, можно использовать propagation = REQUIRES_NEW.