Что случится, если вызвать два метода, оба с аннотацией @Transactional, один за другим?

Если вызвать два метода, оба аннотированные @Transactional, один за другим, поведение транзакций зависит от настроек и контекста вызова.

Короткий ответ

Что ответить на собеседовании

Если вызвать два метода, оба аннотированные @Transactional, один за другим, поведение транзакций зависит от настроек и контекста вызова.

Подробный разбор

Ответ с пояснениями

Если вызвать два метода, оба аннотированные @Transactional, один за другим, поведение транзакций зависит от настроек и контекста вызова.

В Spring Framework по умолчанию используется propagation типа REQUIRED. Это значит:

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

Пример:

@Transactional
public void methodA() {
    // транзакция открыта
    methodB(); // вызов метода с @Transactional
}

@Transactional
public void methodB() {
    // выполняется в той же транзакции, что и methodA
}

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

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

Таким образом, два метода с @Transactional, вызванные один за другим, обычно выполняются в одной транзакции, если вызов происходит в одном потоке и контексте, и propagation не изменён.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее