Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Spring: transactional, proxy

Почему self-invocation не работает с @Transactional?

Вопрос проверяет понимание того, как Spring применяет AOP и почему транзакции не всегда работают так, как ожидается.

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

@Transactional в Spring работает через прокси. При self-invocation метод вызывается внутри того же объекта, минуя прокси. В результате транзакция не создаётся и аннотация игнорируется. Это ограничение прокси-механизма Spring. Для корректной работы нужен вызов через прокси.

Длинный ответ

Определение

Self-invocation — это ситуация, когда метод одного класса вызывает другой метод того же самого класса напрямую.

@Service
class OrderService {

    public void outer() {
        inner(); // self-invocation
    }

    @Transactional
    public void inner() {
        // транзакционный код
    }
}

Как Spring реализует @Transactional

Spring:

  • создаёт прокси вокруг бина

  • перехватывает вызовы методов

  • открывает и закрывает транзакции

Транзакция создаётся только при вызове через прокси.

Почему self-invocation ломает транзакции

При вызове inner():

  • вызов происходит напрямую

  • прокси не участвует

  • аспект транзакции не применяется

Как решить проблему

Распространённые подходы:

  • вынести транзакционный метод в другой бин

  • вызывать метод через ApplicationContext

  • использовать TransactionTemplate

Вывод

@Transactional работает только при вызове через Spring-прокси. Self-invocation обходит прокси и делает аннотацию неэффективной.

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • Spring

    Spring

Ключевые слова

#transactional

#proxy

Подпишись на Java Developer в телеграм