Ответ
@Transactional не выполнит откат транзакции в следующих случаях:
-
Выброшено checked-исключение, не указанное в
rollbackFor. По умолчанию откат происходит только дляRuntimeExceptionиError.@Transactional public void saveData() throws IOException { // ... throw new IOException(); // Отката НЕ будет } -
Исключение перехвачено и не проброшено за пределы метода.
@Transactional public void process() { try { riskyOperation(); // Может бросить RuntimeException } catch (RuntimeException e) { // Исключение поглощено -> отката НЕ будет log.error("Ошибка проигнорирована", e); } } -
Метод вызван изнутри того же класса (self-invocation). Прокси Spring AOP не перехватывает внутренние вызовы.
@Service public class MyService { public void outer() { this.inner(); // Вызов через `this` -> @Transactional на inner() не сработает } @Transactional public void inner() { /* ... */ } } -
Используется распространение
Propagation.NOT_SUPPORTEDилиPropagation.NEVER. Эти атрибуты приостанавливают или запрещают выполнение в транзакции. -
Транзакция помечена как
readOnly = true. Для операций модификации это может привести к исключению, а не к откату.