Java Разработка | Spring Boot Backend & Architecture. Программирование на Джава для Developer. IT Собеседования, Алгоритмы и Coding задачи. Уроки и курсы для роста в Tech.
Наука · 16 июля 2026 г.
🧠 Сейчас покажу баг, который легко пропустить при работе с @Transactional в Spring Boo... — 16 июля 2026 г. в 16:01:51.690
🧠 Сейчас покажу баг, который легко пропустить при работе с @Transactional в Spring Boot 3+. 📌 Проблема — транзакция не работает, потому что метод вызывается изнутри того же класса. Рассмотрим пример: @Service public class UserService { @Transactional public void createUser(User user) { saveUser(user); sendWelcomeEmail(user); // бросает исключение } public void saveUser(User user) { userRepository.save(user); } } 💥 Если sendWelcomeEmail выбросит исключение — транзакция не откатится, потому что @Transactional работает через прокси. Вызов createUser() должен идти извне, чтобы Spring "знал", что нужно обернуть вызов в транзакцию. ✅ Решения: 1. Вынести transactional-метод в отдельный бин: @Service public class UserCreationService { @Transactional public void createUser(User user) { // ... } } 2. Внедрить self-прокси: @Autowired private UserService self; public void externalCaller(User user) { self.createUser(user); } 3. Использовать AopContext: ((UserService) AopContext.currentProxy()).createUser(user); ⚠️ Не забудь включить exposeProxy = true в @EnableAspectJAutoProxy. 💡 Современный подход — разделение ответственности: transactional-методы живут в отдельных сервисах, их проще тестировать и не возникает подобных ловушек. 👉 @BookJava

