Когда метод аннотирован с помощью @Transactional и возникает исключение времени выполнения, Spring съедает исключение и выдает:
org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only
Как избежать этого «общего» исключения и распространить исходное исключение, сохранив при этом откат?
Спасибо.
org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only
В основном это происходит, если у вас есть внешний @Transactional метод, вызывающий внутренний @Transactional метод. Когда внутренний метод выдает исключение, а внешний метод перехватывает это исключение и возвращается в обычном режиме, Spring запутывается и не знает, следует ли откатить или зафиксировать транзакцию, поскольку оба метода противоречат друг другу. (Внутренний метод говорит, что он хочет откатиться, но внешний метод говорит, что он хочет зафиксировать)
Итак, проверьте, есть ли внешние @Transactional методы, которые перехватывают исключение. Если да, повторно сгенерируйте это исключение из внешнего метода, чтобы вся транзакция откатилась.
Вы можете настроить noRollbackFor из @Transactional внутреннего метода, чтобы определить, какое исключение вы не хотите откатывать.
Я ловлю исключение во внешнем классе, которое просто говорит «UnexpectedRollbackException», но я хочу знать, почему внутренний класс генерирует исключение. как сделать внутренний класс неоткатным?