Управление откатом по транзакции - PullRequest
8 голосов
/ 24 февраля 2011

У меня проблема с аннотацией @Transactional.

У меня есть метод, который делает что-то, и внутри я бросаю и ловлю IllegalArgumentException.

Я думаю (даже если я поймал исключение), что он устанавливает транзакцию как rollbackOnly (некоторый триггер на выбросы исключения) и завершается без успешной фиксации транзакции.

Вот ошибка:

org.springframework.transaction.TransactionSystemException : Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly

Я мог бы добавить к @Transactional отсутствие отката - исключение, которое я выбрасываю и ловлю, но я не думаю, что это реальное решение.

Может быть, есть способ отменить откат только для транзакции, но я не думаю, что это тоже лучшая практика ...

Итак, у вас есть идеи, как мне поступить?

Спасибо

Ответы [ 2 ]

6 голосов
/ 24 февраля 2011
  1. Пробовать / ловить с IllegalArgumentException звучит как запах кода (Действующий элемент Java 57: Использовать исключения только для исключительных условий )

  2. Будет ли транзакция установлена ​​на rollbackOnly, зависит от используемого механизма прокси.Если вы используете прокси-серверы JDK, обработчик находится снаружи и не имеет возможности зарегистрировать перехваченное исключение внутри вызова метода.Если вы используете mode=aspectj, все будет иначе.Кроме того, если у вас есть вложенные транзакционные контексты, вы должны будете использовать @Transactional(noRollbackFor=IllegalArgumentException.class) для внутреннего метода.

2 голосов
/ 17 сентября 2012

Если вы не можете зафиксировать транзакцию, возможно, в вашем коде есть исключение. Делая попытку / улов, вы скрываете полное исключение и просто получаете деликатное общее объяснение. Вы также получаете откат.

Чтобы понять вашу ошибку и получить полное описание вашей ошибки, попробуйте отказаться от попытки / поймать и позволить коду взорваться. Там вы увидите реальный источник вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...