Декларативный менеджер транзакций Spring AOP

В диспетчере декларативных транзакций Spring: Моя конфигурация tx:method:

<tx:method name="handle*" propagation="REQUIRED" no-rollback-for="java.lang.RuntimeException" rollback-for="java.lang.Exception" read-only="false"/>

Документация Spring
rollback-for: Исключения, вызывающие откат; с разделителями-запятыми. Например, "com.foo.MyBusinessException,ServletException"

документация no-rollback-for: Исключения, которые не вызывают откат; с разделителями-запятыми. Например, "com.foo.MyBusinessException,ServletException"

Я хочу, чтобы диспетчер транзакций откатился, когда поймал java.lang.Exception, но java.lang.RuntimeException приведет к фиксации.

Подходит ли эта конфигурация для моего запроса? какая связь по поводу : без отката и для отката в tx: методе tx: совета?


person niken    schedule 03.08.2011    source источник
comment
Я ответил на ваш вопрос, но действительно ли это то, что вы хотите сделать: зафиксировать неожидаемое (время выполнения) исключение и откатиться, когда выброшено объявленное исключение?   -  person Ralph    schedule 03.08.2011


Ответы (1)


Короче

It does what you want.


Выигрывает наиболее конкретное (не)-откатное-для-правило, соответствующее конкретному выбрасывающему исключению.

Это означает, что если у вас есть иерархия исключений и правила отката

  • A (расширяет исключение) ‹-- откат
  • Б расширяет А
  • C расширяет B ‹-- без отката
  • D расширяет C
  • E расширяет D ‹-- откат
  • F расширяет E

Тогда выброшенное исключение классов A, B, E и F будет откатываться, а C и D — нет.

(Реализовано в RuleBasedTransactionAttribute.rollBackOn(Throwable ex))

person Ralph    schedule 03.08.2011
comment
Я прочитал RuleBasedTransactionAttribute.rollBackOn(Throwable ex)) codeif (winner == null) { logger.trace(Соответствующее правило отката не найдено: применяются правила по умолчанию); вернуть super.rollbackOn(ex); } return !(выигрышный экземпляр NoRollbackRuleAttribute); - person niken; 03.08.2011
comment
Пример: если моя программа выдает исключение NullPointerException, правило отката обрабатывает это исключение, а исключение NullPointerException является instanceof RuntimeException, поэтому оно вернет false, и менеджер транзакций зафиксирует его. - person niken; 03.08.2011
comment
если программа выдает какие-то исключения, отличные от RuntimeException. transactionManager откатывает ее. - person niken; 03.08.2011
comment
Да, я протестировал его на нескольких случаях.1.I throw java.lang.RuntimeException --->the result is:transactionManager commit the transaction; 2.I throw java.lang.Exception---> the result is:transactionManager rollback the transaction. - person niken; 04.08.2011
comment
@niken: И? - это то, что вы хотите: я хочу, чтобы диспетчер транзакций откатился, когда поймал java.lang.Exception, но java.lang.RuntimeException приведет к фиксации. -- Так в чем проблема? - person Ralph; 04.08.2011
comment
да. Проблема в том, что: я не уверен, какая связь между отсутствием отката и откатом для. Меня беспокоит следующее: программа выдает исключение java.lang.RuntimeException, я хочу, чтобы программа зафиксировалась; Я просто убеждаюсь, что это правда. - person niken; 05.08.2011
comment
Именно это я и написал: более конкретная конфигурация в той, что берется в расчет! - person Ralph; 06.08.2011