使用TransactionTemplate 编程式控制事务

使用 TransactionTemplate 绝对会增加你的代码与Spring的事务框架和API间的耦合。 到底编程式事务管理是不是适合你的项目需要由你自己来决定。

      应用的代码必须在一个事务性的上下文中执行,这样就会像这样一样显式的使用TransactionTemplate。你作为一个应用程序员, 会写一个 TransactionCallback 的实现, (通常会用匿名类来实现 )这样的实现会包含所以你需要在该事务上下文中执行的代码。 然后你会把一个你自己实现TransactionCallback的实例传递给TransactionTemplate暴露的execute(..) 方法。

 

Java代码   收藏代码
  1. public class SimpleService implements Service {  
  2.   
  3.   // single TransactionTemplate shared amongst all methods in this instance  
  4.   private final TransactionTemplate transactionTemplate;  
  5.   
  6.   // use constructor-injection to supply the PlatformTransactionManager  
  7.   public SimpleService(PlatformTransactionManager transactionManager) {  
  8.     Assert.notNull(transactionManager, "The 'transactionManager' argument must not be null.");  
  9.     this.transactionTemplate = new TransactionTemplate(transactionManager);  
  10.   }  
  11.   
  12.   public Object someServiceMethod() {  
  13.     return transactionTemplate.execute(new TransactionCallback() {  
  14.   
  15.       // the code in this method executes in a transactional context  
  16.       public Object doInTransaction(TransactionStatus status) {  
  17.         updateOperation1();  
  18.         return resultOfUpdateOperation2();  
  19.       }  
  20.     });  
  21.   }  
  22. }  

 如果不需要返回值,更方便的方式是创建一个 TransactionCallbackWithoutResult 的匿名类,如下:

transactionTemplate.execute(new TransactionCallbackWithoutResult



() {

  protected void doInTransactionWithoutResult(TransactionStatus status) {
    updateOperation1();
    updateOperation2();
  }
});

回调方法内的代码可以通过调用 TransactionStatus 对象的 setRollbackOnly() 方法来回滚事务。

 

      诸如传播模式、隔离等级、超时等等的事务设置都可以在TransactionTemplate 中或者通过配置或者编程式地实现。 TransactionTemplate 实例默认继承了默认事务设置 。 下面有个编程式的为一个特定的TransactionTemplate 定制事务设置的例子。

 

Java代码   收藏代码
  1. public class SimpleService implements Service {  
  2.   
  3.   private final TransactionTemplate transactionTemplate;  
  4.   
  5.   public SimpleService(PlatformTransactionManager transactionManager) {  
  6.     Assert.notNull(transactionManager, "The 'transactionManager' argument must not be null.");  
  7.     this.transactionTemplate = new TransactionTemplate(transactionManager);  
  8.   
  9.     // the transaction settings can be set here explicitly if so desired  
  10.     this.transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_UNCOMMITTED);  
  11.     this.transactionTemplate.setTimeout(30); // 30 seconds  
  12.     // and so forth...  
  13.   }  
  14. }  

      在下面的例子中,我们将会演示如何使用Spring XML配置来定制TransactionTemplate 的事务属性。sharedTransactionTemplate 可以被注入到所有需要的服务中去。

Java代码   收藏代码
  1. <bean id="sharedTransactionTemplate"  
  2.     class="org.springframework.transaction.support.TransactionTemplate">  
  3.   <property name="isolationLevelName" value="ISOLATION_READ_UNCOMMITTED"/>  
  4.   <property name="timeout" value="30"/>  
  5. </bean>"  

     最后,TransactionTemplate 类的实例是线程安全的,任何状态都不会被保存。 TransactionTemplate 实例 的确会 维护配置状态,所以当一些类选择共享一个单独的 TransactionTemplate 实例时, 如果一个类需要使用不同配置的TransactionTemplate (比如,不同的隔离等级), 那就需要创建和使用两个不同的TransactionTemplate 。

转载自:http://wzhw2008.iteye.com/blog/1687523


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值