Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

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

Сколько транзакций будет создано при вызове транзакционного метода внутри того же класса?

Вопрос проверяет знание ограничений прокси-механизма Spring и типичную ловушку при работе с @Transactional.

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

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

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

На первый взгляд кажется логичным, что при вызове одного метода из другого в том же классе транзакция должна работать. Но из-за прокси-механизма это не так.

Определение

Self-invocation — это вызов метода бина из другого метода того же бина напрямую, без прохождения через Spring-прокси.

Что происходит на самом деле

1) Структура бина

Spring создаёт:

  1. реальный объект класса

  2. прокси-объект поверх него

2) Вызов внутри класса

Когда метод вызывает другой метод того же класса:

  1. вызов идёт напрямую (this.method())

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

  3. транзакционная логика не применяется

Пример ситуации

@Service
public class UserService {

    public void outer() {
        inner(); // транзакции не будет
    }

    @Transactional
    public void inner() {
        // ожидалась транзакция, но её нет
    }
}

Почему так сделано

  1. Прокси перехватывает только внешние вызовы

  2. Внутренние вызовы неотличимы от обычных методов Java

  3. Это компромисс архитектуры AOP в Spring

Как с этим работать

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

  2. Вызывать метод через другой сервис

  3. Использовать более сложные AOP-настройки (редко)

Краткий вывод

При вызове транзакционного метода внутри того же класса транзакция не создаётся, потому что вызов не проходит через прокси.

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • Spring

    Spring

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

#transactional

#proxy

#spring

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