现在的位置: 首页 > 综合 > 正文

Spring受控异常与非受控异常

2013年12月04日 ⁄ 综合 ⁄ 共 1898字 ⁄ 字号 评论关闭

Spring受控异常与非受控异常

由于本人对Spring没有很深入了解,发了此贴:

http://topic.csdn.net/u/20100120/17/5ca75ab5-7278-42d0-888b-d0157b74ad71.html

不过再这一贴中也让我学到了不少.

进入正题:

清单10. 没有回滚支持
@Transactional(propagation=Propagation.REQUIRED)

public TradeData placeTrade(TradeData trade) throws Exception {
        try {
                insertTrade(trade);
                updateAcct(trade);
                return trade;
        } catch (Exception up) {
                //log the error
                throw up;
        }
}

 

假设帐户中没有足够的资金来购买需要的股票,或者还没有准备购买或出售股票,并抛出了一个受控异常
(例如FundsNotAvailableException),那么交易订单会保存在数据库中吗?还是整个逻辑工作单元将执行回
滚?答案出乎意料:根据受控异常(不管是在Spring Framework 中还是在EJB 中),事务会提交它还未提
交的所有工作。使用清单10,这意味着,如果在执行updateAcct() 方法期间抛出受控异常,就会保存交
易订单,但不会更新帐户来反映交易情况。
这可能是在使用事务时出现的主要数据完整性和一致性问题了。运行时异常(即非受控异常)自动强制执
行整个逻辑工作单元的回滚,但受控异常不会。因此,清单10 中的代码从事务角度来说毫无用处;尽管
看上去它使用事务来维护原子性和一致性,但事实上并没有。
尽管这种行为看起来很奇怪,但这样做自有它的道理。首先,不是所有受控异常都是不好的;它们可用于
事件通知或根据某些条件重定向处理。但更重要的是,应用程序代码会对某些类型的受控异常采取纠正操
作,从而使事务全部完成。例如,考虑下面一种场景:您正在为在线书籍零售商编写代码。要完成图书的
订单,您需要将电子邮件形式的确认函作为订单处理的一部分发送。如果电子邮件服务器关闭,您将发送
某种形式的SMTP 受控异常,表示邮件无法发送。如果受控异常引起自动回滚,整个图书订单就会由于电
子邮件服务器的关闭全部回滚。通过禁止自动回滚受控异常,您可以捕获该异常并执行某种纠正操作(如
向挂起队列发送消息),然后提交剩余的订单。

 

使用Declarative 事务模式时,必须指定容器或框架应该如何处理受控异常。在Spring Framework 中,
过@Transactional 注释中的rollbackFor 参数进行指定
,如清单11 所示:

 

清单11. 添加事务回滚支持— Spring
@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
public TradeData placeTrade(TradeData trade) throws Exception {
       try {
              insertTrade(trade);
              updateAcct(trade);
              return trade;

       } catch (Exception up) {
              //log the error
              throw up;
       }
}

 注意,@Transactional 注释中使用了rollbackFor 参数。这个参数接受一个单一异常类或一组异常类,您也
可以使用rollbackForClassName 参数将异常的名称指定为Java String 类型。还可以使用此属性的相反形式
(noRollbackFor)指定除某些异常以外的所有异常应该强制回滚。通常大多数开发人员指定Exception.class
作为值,表示该方法中的所有异常应该强制回滚。

 

Spring事务配置:http://www.blogjava.net/robbie/archive/2009/04/05/264003.html

Spring与ibatis :http://lavasoft.blog.51cto.com/62575/83900

 

如果有什么不对的地方请帮忙指出,谢谢!

 

 

 

抱歉!评论已关闭.