【问题标题】:Spring AOP declaractive transaction managerSpring AOP 声明式事务管理器
【发布时间】:2011-10-18 19:44:27
【问题描述】:

在 Spring 声明式事务管理器中: 我的配置 tx:method:

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

春天
rollback-for 文档是:将触发回滚的异常;逗号分隔。例如,'com.foo.MyBusinessException,ServletException'

no-rollback-for 文档是:不会触发回滚的异常;逗号分隔。例如,'com.foo.MyBusinessException,ServletException'

我希望事务管理器在捕获 java.lang.Exception 时回滚,但 java.lang.RuntimeException 将导致提交。

此配置是否符合我的要求? tx:method of tx:advice中no-rollback-for和rollback-for是什么关系?

【问题讨论】:

  • 我已经回答了你的问题,但这真的是你想要做的:提交意外的(运行时)异常并在抛出声明的异常时回滚?

标签: spring transactions aop jta


【解决方案1】:

总之

它做你想做的。


匹配 concreate throwing 异常的最具体(no)-rollback-for 规则获胜。

这意味着如果您有异常层次结构和回滚规则

  • A(扩展异常)
  • B 扩展 A
  • C 扩展 B
  • D 扩展 C
  • E 扩展 D
  • F 扩展 E

那么A、B、E、F类抛出的异常会回滚,但C、D不会。

(在RuleBasedTransactionAttribute.rollBackOn(Throwable ex)中实现)

【讨论】:

  • 我阅读了 RuleBasedTransactionAttribute.rollBackOn(Throwable ex)) codeif (winner == null) { logger.trace("未找到相关回滚规则:应用默认规则");返回 super.rollbackOn(ex); } return !(noRollbackRuleAttribute 的获胜者实例);
  • 例子:如果我的程序抛出NullPointerException,回滚规则会处理这个异常,而NullPointerException是instanceof RuntimeException,所以会返回false,事务管理器会提交。
  • 如果程序抛出某种非RuntimeException。transactionManager会回滚它。
  • 是的,我用几个案例测试过。1.I throw java.lang.RuntimeException ---&gt;the result is:transactionManager commit the transaction; 2.I throw java.lang.Exception---&gt; the result is:transactionManager rollback the transaction.
  • @niken:然后呢? - 这就是你想要的:“我希望事务管理器在捕获 java.lang.Exception 时回滚,但 java.lang.RuntimeException 将导致提交。” -- 那么问题出在哪里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 2011-04-12
  • 2011-10-06
相关资源
最近更新 更多