Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
24 Янв 2023
2 мин
3523

Понимание @Transactional в Spring Framework

Иногда возникает вопрос о том, что происходит при использовании аннотации @Transactional в Spring Framework. Данная аннотация является ключевой в транзакционном

Иногда возникает вопрос о том, что происходит при использовании аннотации @Transactional в Spring Framework. Данная аннотация является ключевой в транзакционном управлении Spring, и её понимание может помочь в написании более эффективного и безопасного кода.

Разработка на Java — востребованное направление, такие специалисты будут нужны на рынке еще долго. На курсе «Java-разработчик» от Skypro освоить профессию можно с нуля за 11 месяцев, даже если вы гуманитарий и ничего не знаете об IT. Программа составлена от простого к сложному и адаптирована для новичков. Преподаватели — практикующие специалисты из крупных компаний: «Сбер», «Самокат» и других.

Прокси-классы в Spring

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

Прокси класс — это специально созданный класс, который служит промежуточным звеном между вызывающим кодом и целевым методом. Он перехватывает вызовы методов и выполняет дополнительную логику, прежде чем передать вызов целевому методу. В случае @Transactional, эта дополнительная логика заключается в управлении транзакцией.

Однако прямо взглянуть на созданный Spring прокси класс не выйдет, поскольку он создается динамически во время выполнения программы.

В Skypro на курсе «Java-разработчик» вы научитесь писать программы для игр и приложений, освоите все нужные инструменты: Git, GitHub, Docker, Swagger, PostgreSQL и другие. Потренируетесь под руководством опытных наставников и соберете сильное портфолио. На курсе действует гарантия трудоустройства: поможем вам найти работу или вернем деньги за курс.

Внешние и внутренние вызовы методов

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

Это связано с тем, как работает механизм прокси. Прокси класс перехватывает только внешние вызовы методов, приходящие через прокси. Если метод объекта вызывает другой метод этого же объекта напрямую (т.е. самовызов), то этот вызов обходит прокси, и, следовательно, не перехватывается им.

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

Важно помнить об этих особенностях при работе с @Transactional, чтобы избегать непредвиденного поведения и ошибок в работе с транзакциями.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий