Sobes.tech
Back to questions
Junior — Middle
52

Как определить количество транзакций при вызове метода, аннотированного @Transactional, из другого метода с такой же аннотацией, расположенного в другом классе в Spring?

Companies where asked
Северсталь-ИфокомСеверсталь-Ифоком

Answer from AI

sobes.tech AI

В Spring аннотация @Transactional управляет транзакциями на уровне прокси. При вызове метода с @Transactional из другого класса, также аннотированного @Transactional, Spring создаёт или использует существующую транзакцию в зависимости от настроек propagation.

Чтобы определить количество транзакций при таком вызове, нужно учитывать:

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

Для точного подсчёта транзакций можно использовать:

  • Логирование или отладку транзакционного менеджера.
  • Внедрение кастомного PlatformTransactionManager или слушателя транзакций.
  • Использование AOP для перехвата начала и окончания транзакций.

Пример логирования начала транзакции:

@Component
public class TransactionLogger implements TransactionSynchronization {
    @Override
    public void beforeCommit(boolean readOnly) {
        System.out.println("Транзакция начинается");
    }

    @Override
    public void afterCompletion(int status) {
        System.out.println("Транзакция завершена");
    }
}

И регистрацию этого слушателя в TransactionSynchronizationManager.

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