Метод бросил исключение, ты ждёшь rollback, а в БД лежат наполовину применённые изменения. Скорее всего, исключение было checked:
@Transactional
public void process() throws BusinessException {
repo.save(a);
if (bad) throw new BusinessException("..."); // checked
repo.save(b);
}
По умолчанию Spring откатывает транзакцию только на RuntimeException и Error. На любом checked-исключении (наследники Exception, кроме RuntimeException) транзакция коммитится. Это не баг, а наследие декларативных транзакций из EJB.
Два пути:
// 1) явно расширить условие отката
@Transactional(rollbackFor = Exception.class)
// 2) или сделать доменные исключения unchecked
public class BusinessException extends RuntimeException { ... }
Проверь свои сервисные методы, которые бросают checked-исключения внутри @Transactional — там часто прячется молчаливый частичный коммит.
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#Enterprise