Когда аннотация @Transactional может не сработать?
Ответ от нейросети
sobes.tech AI
Аннотация @Transactional в Java может не сработать в следующих случаях:
-
Вызов метода с
@Transactionalвнутри того же класса — если метод с аннотацией вызывается из другого метода того же класса напрямую, прокси Spring не перехватит вызов, и транзакция не будет создана. -
Метод не является публичным — по умолчанию Spring создает прокси для публичных методов, если метод приватный или защищённый, аннотация может не сработать.
-
Отсутствие конфигурации транзакций — если Spring не настроен для поддержки транзакций (например, не включена аннотация
@EnableTransactionManagement), аннотация игнорируется. -
Исключения, не приводящие к откату — по умолчанию транзакция откатывается только при unchecked исключениях (RuntimeException). Если выбрасывается checked исключение, откат не произойдет, если явно не указано.
-
Использование
@Transactionalна методах интерфейса без прокси CGLIB — если прокси создается через JDK динамические прокси, а метод не объявлен в интерфейсе, аннотация может не сработать.
Пример проблемы с вызовом внутри класса:
@Service
public class MyService {
@Transactional
public void transactionalMethod() {
// ...
}
public void nonTransactionalMethod() {
transactionalMethod(); // вызов внутри класса, транзакция не создастся
}
}