【问题标题】:example of spring declarative roolback-for?春季声明性回滚的例子?
【发布时间】:2010-10-07 11:58:23
【问题描述】:

想要spring aop中的声明式事务管理示例......

其实这里

<aop:config>
    <aop:advisor advice-ref="addAdvice" pointcut="execution(* com.DAO.*.*(..))"/>
</aop:config>
<tx:advice id="addAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="add*" propagation="REQUIRED" rollback-for="" />
    </tx:attributes>
</tx:advice>

所以这里我想写的实际上是 rollback-for="" ,有什么方法或其他方法吗? 如果方法,那么该方法将放在哪里?

【问题讨论】:

    标签: java spring transactions aop


    【解决方案1】:

    rollback-for 中指定异常的名称。例如,如果你想回滚your.pkg.NoProductInStockException,你写

    rollback-for="your.pkg.NoProductInStockException"
    

    如果遇到与指定匹配的异常,这将使事务回滚。如果抛出不匹配的异常,则将其传播到服务的调用者或包装到TransactionRolledBackException

    The transaction documentation 解释:

    向 Spring 框架的事务基础结构指示事务工作要回滚的推荐方法是从当前在事务上下文中执行的代码中抛出异常。 Spring Framework 的事务基础结构代码将在调用堆栈冒泡时捕获任何未处理的异常,并确定是否将事务标记为回滚。

    在其默认配置中,Spring Framework 的事务基础结构代码仅在运行时、未经检查的异常情况下将事务标记为回滚;也就是说,当抛出的异常是 RuntimeException 的实例或子类时。 (错误也会 - 默认情况下 - 导致回滚)。从事务方法抛出的检查异常不会导致默认配置回滚。

    您可以准确配置哪些异常类型将事务标记为回滚,包括已检查的异常。

    【讨论】:

    • 感谢 bozho 的回复,但我们究竟要在“NoProductInStockException”中写些什么呢?我们必须编写我们的回滚方法还是异常处理?你能给我举个例子吗?
    【解决方案2】:

    默认情况下,对于未经检查的异常应该不需要这样做。如果在方法中抛出未经检查的异常,则必须使用 rollback-for 属性。您可以使用正则表达式样式,例如:*InStockException

    【讨论】:

      猜你喜欢
      • 2012-04-21
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多