使用TransactionTemplate 编程式控制事务

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

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

 

Java代码 复制代码 收藏代码使用TransactionTemplate <wbr>编程式控制事务
  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 transactional context   
  16.       public Object doInTransaction(TransactionStatus status) {   
  17.         updateOperation1();   
  18.         return resultOfUpdateOperation2();   
  19.       }   
  20.     });   
  21.   }   
  22.  
public class SimpleService implements Service {

  // single TransactionTemplate shared amongst all methods in this instance
  private final TransactionTemplate transactionTemplate;

  // use constructor-injection to supply the PlatformTransactionManager
  public SimpleService(PlatformTransactionManager transactionManager) {
    Assert.notNull(transactionManager, "The 'transactionManager' argument must not be null.");
    this.transactionTemplate = new TransactionTemplate(transactionManager);
  }

  public Object someServiceMethod() {
    return transactionTemplate.execute(new TransactionCallback() {

      // the code in this method executes in a transactional context
      public Object doInTransaction(TransactionStatus status) {
        updateOperation1();
        return resultOfUpdateOperation2();
      }
    });
  }
}

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

transactionTemplate.execute(new TransactionCallbackWithoutResult



() {

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

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

 

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

 

Java代码 复制代码 收藏代码使用TransactionTemplate <wbr>编程式控制事务
  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.  
public class SimpleService implements Service {

  private final TransactionTemplate transactionTemplate;

  public SimpleService(PlatformTransactionManager transactionManager) {
    Assert.notNull(transactionManager, "The 'transactionManager' argument must not be null.");
    this.transactionTemplate = new TransactionTemplate(transactionManager);

    // the transaction settings can be set here explicitly if so desired
    this.transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_UNCOMMITTED);
    this.transactionTemplate.setTimeout(30); // 30 seconds
    // and so forth...
  }
}

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

Java代码 复制代码 收藏代码使用TransactionTemplate <wbr>编程式控制事务
  1. "sharedTransactionTemplate"  
  2.     class="org.springframework.transaction.support.TransactionTemplate">   
  3.   "isolationLevelName" value="ISOLATION_READ_UNCOMMITTED"/>   
  4.   "timeout" value="30"/>   
  5.  

  
  
"

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

 

 

http://wzhw2008.iteye.com/blog/1687523

posted @ 2015-03-25 20:01  刘竹青  阅读(752)  评论(0编辑  收藏  举报