@Transactional внутри того же класса не запускает новую транзакцию.Почему? Spring оборачивает бин в прокси, а внутренние вызовы проходят мимо прокси, значит, аннотация игнорируется.
Пример проблемы:
@Service
public class OrderService {
@Transactional
public void createOrder() {
saveOrder();
}
@Transactional
public void saveOrder() {
// Новый транзакционный контекст не создастся!
}
}
💡 Как правильно:
1. Вынести
saveOrder() в отдельный бин.2. Или получить прокси текущего бина через
AopContext:
@Service
@EnableAspectJAutoProxy(exposeProxy = true) // важно!
public class OrderService {
@Transactional
public void createOrder() {
((OrderService) AopContext.currentProxy()).saveOrder();
}
@Transactional
public void saveOrder() {
// Теперь всё ок ✅
}
}
⚠️ Важный момент:
exposeProxy = true нужен на уровне конфигурации, иначе AopContext не заработает.Понимание этой тонкости критично для корректного управления транзакциями в Spring! 🚀
👉@BookJava
