Checked-исключение внутри @Transactional и откат
Метод сохраняет документ и выгружает файл в объектное хранилище:
@Transactional
public void process(Doc doc) throws IOException {
docRepository.save(doc); // вставка строки в PostgreSQL
storage.upload(doc); // бросает IOException при недоступности хранилища
}
Хранилище недоступно, upload бросает IOException. Что будет со строкой в базе при настройках по умолчанию?
- Транзакция откатится: любое исключение, вышедшее из транзакционного метода, приводит к откату изменений
- Транзакция не откатится: по умолчанию откат идёт только на RuntimeException и Error, для checked нужен rollbackFor
- Транзакция не откатится, потому что save() фиксирует изменения в базе сразу в момент своего вызова
- Поведение зависит от того, был ли до исключения вызван flush: без него изменения просто не дойдут до базы
