快速业务通道

Spring事务探索 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
c here  } catch (MyException ex) ...{    transactionManager.rollback(status);    throw ex; } transactionManager.commit(status);

这是直接使用transactionManager的例子,可以看到真正执行business logic 的地方是在try当中那段,前后的代码都是为了完成事务管理的。如果每个business logic都要写上那么一段,我肯定是疯了。我们翻出TransactionTemplate的代码看看他怎么化简了我们的代码

代码

public Object execute(TransactionCallback action) throws TransactionException ...{      TransactionStatus status = this.transactionManager.getTransaction(this);      Object result = null;      try ...{        result = action.doInTransaction(status);      }      catch (RuntimeException ex) ...{        // transactional code threw application exception -> rollback        rollbackOnException(status, ex);        throw ex;      }      catch (Error err) ...{        // transactional code threw error -> rollback        rollbackOnException(status, err);        throw err;      }      this.transactionManager.commit(status);      return result;    }

Spring事务探索(3)

时间:2011-03-24

同上面的代码如出一辙,前后是事务处理代码,当中那段result = action.doInTransaction(status);是我们的应用代码。至于action是什么,全看各位的需要了。但是有一点要主要,如果利用TransactionTemplate,那么他不管你扔出什么异常都会回滚事务,但是回滚的是哪个事务呢?继续挖代码

代码

private void rollbackOnException(TransactionStatus status, Throwable ex) throws TransactionException ...{      if (logger.isDebugEnabled()) ...{        logger.debug("Initiating transaction rollback on application exception", ex);       }      try ...{        this.transactionManager.rollback(status);      }      catch (RuntimeException ex2) ...{        logger.error("Application exception overridden by rollback exception", ex);        throw ex2;      }      catch (Error err) ...{        logger.error("Application exception overridden by rollback error", ex);        throw err;      }    }

真相大白,是对template所持有的某个transactionManager进行回滚。所以如果你的应用代码用的是事务源a的一些资源,比如到服务器a的一个datasource,但是你的transactionManager管理的是另一些资源,比如服务器b的一个datasource,代码铁定不会正常运行

特别是在一些多事务源的程序里,这点千万不能搞错。如果多个事务源之间要完成全局事务,还是老老实实用分布式事务管理服务吧(jta)

那么TransactionInterceptor是干什么的?这个是spring 的声明式事务的支持方式。因为用TransactionTemplate要硬编码,而且调整事务策略很麻烦(不是说不能调。举个例子原来程序抛出异常A需要回滚,现在不需要要,我就可以把a catch吃掉。这时候template就不会回滚了。但是每次调整都要重写编码。)而用TransactionInterceptor就可以将这些调整写在配置中。我们再来挖TransactionInterceptor的代码

代码

public Object invoke(MethodInvocation invocation) throws Throwable ...{      // Work out the target class: may be null.      // The Tra

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号