Sobes.tech
Назад к вопросам
Senior
3

В каких случаях @Transactional не сработает?

Компании, где спрашивали
EXPERA

Ответ от нейросети

sobes.tech AI

Аннотация @Transactional в Spring не сработает в следующих случаях:

  • Вызов метода внутри того же класса (self-invocation): если метод с @Transactional вызывается из другого метода того же класса, прокси Spring не перехватит вызов, и транзакция не будет создана.
  • Метод не публичный: по умолчанию Spring создает прокси для публичных методов. Если метод с @Transactional имеет уровень доступа private, protected или пакетный, транзакция может не примениться.
  • Отсутствие прокси или неправильная конфигурация: если контекст Spring не настроен на создание прокси (например, отсутствует <tx:annotation-driven> или @EnableTransactionManagement), аннотация не сработает.
  • Исключения, не приводящие к откату: по умолчанию транзакция откатывается только при unchecked исключениях (RuntimeException и Error). Если метод выбрасывает checked исключение, транзакция не откатится, если явно не указано иное.
  • Метод помечен как final или класс final: прокси на основе JDK-интерфейсов не смогут проксировать такие методы.

Пример self-invocation, где транзакция не сработает:

@Service
public class MyService {

    @Transactional
    public void transactionalMethod() {
        // код в транзакции
    }

    public void nonTransactionalMethod() {
        transactionalMethod(); // вызов внутри класса — транзакция не создастся
    }
}