Sobes.tech
Назад к вопросам
Middle
7

Когда аннотация @Transactional может не сработать?

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

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

sobes.tech AI

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

  1. Вызов метода с @Transactional внутри того же класса — если метод с аннотацией вызывается из другого метода того же класса напрямую, прокси Spring не перехватит вызов, и транзакция не будет создана.

  2. Метод не является публичным — по умолчанию Spring создает прокси для публичных методов, если метод приватный или защищённый, аннотация может не сработать.

  3. Отсутствие конфигурации транзакций — если Spring не настроен для поддержки транзакций (например, не включена аннотация @EnableTransactionManagement), аннотация игнорируется.

  4. Исключения, не приводящие к откату — по умолчанию транзакция откатывается только при unchecked исключениях (RuntimeException). Если выбрасывается checked исключение, откат не произойдет, если явно не указано.

  5. Использование @Transactional на методах интерфейса без прокси CGLIB — если прокси создается через JDK динамические прокси, а метод не объявлен в интерфейсе, аннотация может не сработать.

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

@Service
public class MyService {

    @Transactional
    public void transactionalMethod() {
        // ...
    }

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