Hardtransactionsexceptions
Чем checked exception отличается в транзакциях Spring?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
По умолчанию @Transactional откатывает только unchecked exceptions (RuntimeException и подклассы) и Error. Checked exceptions (IOException, SQLException) НЕ вызывают rollback.
@Service
public class ImportService {
// ПЛОХО: IOException НЕ откатит транзакцию
@Transactional
public void importFile(String path) throws IOException { /* ... */ }
// ХОРОШО: откатывать на всех Exception
@Transactional(rollbackFor = Exception.class)
public void importFileSafe(String path) throws IOException { /* ... */ }
// noRollbackFor — исключить конкретные
@Transactional(rollbackFor = Exception.class, noRollbackFor = BusinessException.class)
public void process() { /* ... */ }
}- В современном коде обычно
rollbackFor = Exception.classкак default (безопаснее); - Бизнес-исключение extends
RuntimeException→ автоматически rollback; - Spring rollback работает через ThreadLocal в
TransactionSynchronizationManager.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.