Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

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

Как работает @Transactional и что происходит, если метод без аннотации вызывает метод с аннотацией?

Этот вопрос проверяет понимание механизма транзакций в Spring и поведения прокси при вызове методов внутри одного класса.

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

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

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

Что делает @Transactional:

  • Открывает транзакцию перед выполнением метода.

  • Фиксирует изменения (commit) после успешного завершения.

  • Откатывает (rollback) при исключениях (по умолчанию — RuntimeException и Error).

Как Spring реализует это:

  • Использует прокси (обычно через JDK или CGLIB).

  • Прокси оборачивает вызов метода и добавляет транзакционную логику.

Проблема с внутренними вызовами:

Если метод А вызывает метод B в том же классе, и только B аннотирован @Transactional, тогда:

  • Вызов происходит напрямую, без прокси.

  • Аннотация @Transactional не срабатывает.

  • Транзакция не начинается.

Как обойти:

  • Вынести метод в отдельный бин.

  • Или вызвать через ApplicationContext.getBean(...).

Пример:

@Service
public class UserService {
    
    	public void outerMethod() {
        	innerMethod(); // не работает через прокси
    	}

    	@Transactional
    	public void innerMethod() {
        	// транзакция не начнется
    	}
}

Вывод:
@Transactional работает через прокси, поэтому внутренние вызовы аннотированных методов не активируют транзакцию. Решение — вынос в другой бин или вызов через прокси.

Уровень

  • Рейтинг:

    2

  • Сложность:

    7

Навыки

  • Java

    Java

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

#spring

#transactional

#proxy

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