Назад к вопросам
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(); // вызов внутри класса — транзакция не создастся
}
}