Как избежать исключения org.springframework.transaction.UnexpectedRollbackException?

Когда метод аннотирован с помощью @Transactional и возникает исключение времени выполнения, Spring съедает исключение и выдает:

org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only

Как избежать этого «общего» исключения и распространить исходное исключение, сохранив при этом откат?

Спасибо.

7
0
8 652
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only

В основном это происходит, если у вас есть внешний @Transactional метод, вызывающий внутренний @Transactional метод. Когда внутренний метод выдает исключение, а внешний метод перехватывает это исключение и возвращается в обычном режиме, Spring запутывается и не знает, следует ли откатить или зафиксировать транзакцию, поскольку оба метода противоречат друг другу. (Внутренний метод говорит, что он хочет откатиться, но внешний метод говорит, что он хочет зафиксировать)

Итак, проверьте, есть ли внешние @Transactional методы, которые перехватывают исключение. Если да, повторно сгенерируйте это исключение из внешнего метода, чтобы вся транзакция откатилась.

Я ловлю исключение во внешнем классе, которое просто говорит «UnexpectedRollbackException», но я хочу знать, почему внутренний класс генерирует исключение. как сделать внутренний класс неоткатным?

Sudo Pehpeh 29.10.2021 07:49

Вы можете настроить noRollbackFor из @Transactional внутреннего метода, чтобы определить, какое исключение вы не хотите откатывать.

Ken Chan 11.11.2021 16:00

Другие вопросы по теме