Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30465536
  • 博文数量: 708
  • 博客积分: 12163
  • 博客等级: 上将
  • 技术积分: 8240
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-04 20:59
文章分类

全部博文(708)

分类: Java

2008-05-08 17:46:06

转的,虽然看不太懂,但是也要好好学!

 

Spring的事务处理机制,给我们编程带来了极大的方便,One-Transaction-Per-Request的实现模式,是本人最为欣赏的!

在之前开始接触Spring的时候,为了实现事务处理的模式,我们在声明事务的时候,一般是这么做

首先声明一个事务模板,

            class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
       
           
       

       
           
                PROPAGATION_REQUIRED
                PROPAGATION_REQUIRED
                PROPAGATION_REQUIRED
                PROPAGATION_REQUIRED
                PROPAGATION_REQUIRED
                PROPAGATION_REQUIRED,readOnly
           

       

   
 

接着,声明一个service类,使用Spring的事务处理模板

   
       
           
               
           

       

   

这种声明方式我足足用了两年,自从与李刚才师接触后,买了在他著作的《》,学习之后,发现原来Spring也可以这么配置

基于AOP技术的事务处理方式,首先声明一个事务的拦截器

   class="org.springframework.transaction.interceptor.TransactionInterceptor">
  
  
   
    PROPAGATION_REQUIRED
    PROPAGATION_REQUIRED
    PROPAGATION_REQUIRED
    PROPAGATION_REQUIRED
    PROPAGATION_REQUIRED,readOnly
   

  

 

接着,声明一个自动代理

 
  
   *Service
  

  
   
    transactionInterceptor
   

  

 

 
  
 

该自动代理的意思是,所有以Service的bean,都是需要使用该拦截器。

以下是ServiceBean的配置

 
  
 

这种配置方式简单得多,虽然对于有些程序员觉得使用copy & paste,其实都是一差不多,但是,配置文件至少可以少一大半,方便维护!

 

1 、什么是Spring事务处理?

什么是事务处理我就不想回答了。 Spring 的事务处理,可以说是 Spring AOP 的一种实现。因为事务处理是所谓方面( Aspect )的一个子集。因此默认情况下,事务处理是利用 Java 动态代理机制实现的,这样就必须先定义一个接口,然后再编写实现;而对于没有接口的 Javabean ,则通过 CGLIB 实现。这部分是 Spring AOP 部分的内容。

2 、两种事务处理方式

EJB 一样, Spring 也提供两种事务处理方式,一种是编程式事务处理;一种是声明式事务处理。

   何时使用什么

          如果需要大量的事务处理,就用声明式事务处理,如果很少的事务处理,就用编程式

二、详细

              编程式事务处理与声明式事务处理

(一)编程式事务处理

1 、使用TransactionTemplate进行事务处理(Spring进行commitrollback

          1 )使用事务处理的类

 

import javax.sql.DataSource;

import org.springframework.jdbc.core.*;

import org.springframework.transaction.*;

import org.springframework.dao.*;

 

public class bookDAO{

private DataSource dataSource;// 依赖注入 dataSource ,管理数据库

private PlatformTransationManager transactionManager;// 依赖注入管理事务

 

public void setDataSource(DataSource dataSource){

    this.dataSource=dataSource;

}

 

     public void setTransactionManager(PlatformTransationManager transactionManager){

         this. transactionManager= transactionManager;

}

 

public int create(String msg){

    TransactionTemplate transactionTemplate=new TransactionTemplate(transactionManager);

    // 调用 transactionTemplate execute 方法进行事务管理

    Object result= transactionTemplate.execute (

     // 这是一个回调函数,实现了 TransactionCallback 接口的 doInTransaction 方法,就是在这个方法里写数据库新增数据的操作

      

{

          public Object doInTransaction(TransactionStatus status)

{

              // 数据库操作代码

              return resultObject;

           }

       }

[U1]       )

}

}

如果不想返回结果( resultObject ),则可以用 TransactionCallbackWithoutResult 来实现 TransactionCallback 接口,代码如下:

        new TransactionCallback WithoutResult ()

{

          public Object doInTransaction WithoutResult (TransactionStatus status)

{

              // 数据库操作代码

            

           }

       }

 

2 )配置文件

 "">

    dataSource à

  

      使用SQL Server à

      

          com.microsoft.jdbc.sqlserver.SQLServerDriver

      

       

          jdbc:Microsoft:sqlserver://localhost:1433/stdb

      

          admin

      

          admin

      

   

 

    设定 transactionManager à

   

class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”>

        

           

       

   

 

   示例中 DAO-->

   

       

           

       

       

           

       

  

   这样 Spring 就可以自动进行 commit rollback 这两个操作了。粉色部分是为了和 bookDAO 中的粉色部分相匹配。

2 、使用JdbcTemplate进行事务处理(硬编码进行commitrollback

1 )使用事务处理的类

 

import javax.sql.DataSource;

import org.springframework.jdbc.core.*;

import org.springframework.transaction.*;

import org.springframework.dao.*;

 

public class bookDAO{

private DataSource dataSource;// 依赖注入 dataSource ,管理数据库

private PlatformTransationManager transactionManager;// 依赖注入管理事务

 

public void setDataSource(DataSource dataSource){

    this.dataSource=dataSource;

}

 

     public void setTransactionManager(PlatformTransationManager transactionManager){

         this. transactionManager= transactionManager;

}

 

public int create(String msg){

  /*  TransactionTemplate transactionTemplate=new TransactionTemplate(transactionManager);

      Object result= transactionTemplate.execute (

       new TransactionCallback()

{

          public Object doInTransaction(TransactionStatus status)

{

 

              return resultObject;

           }

       }

    )*/

  // 使用下面的代码替换上面注释掉的部分

    DefaultTransactionDefinition def =new DefaultTransactionDefinition();

   TransactionStatus status=transactionManager.getTransaction(def);

   try

{

        JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);

        jdbcTemplate.update(“INSERT INTO book VALUES(1,’gf’,’Mastering Spring’)”);

   }

   catch(DataAccessException ex)

{

       transactionzManager.rollback(status);

       throw ex;

   }

   finally

   {

        transactionManager.commit(status);

   }

}

}

2 )配置文件

同上

 

( )声明式事务处理

1 )使用事务处理的类

 

import javax.sql.DataSource;

import org.springframework.jdbc.core.*;

import org.springframework.transaction.*;

import org.springframework.dao.*;

 

public class bookDAO{

private DataSource dataSource;// 依赖注入 dataSource ,管理数据库

private PlatformTransationManager transactionManager;// 依赖注入管理事务

 

public void setDataSource(DataSource dataSource){

    this.dataSource=dataSource;

}

 

     public void setTransactionManager(PlatformTransationManager transactionManager){

         this. transactionManager= transactionManager;

}

 

public int create(String msg){

  /*  TransactionTemplate transactionTemplate=new TransactionTemplate(transactionManager);

      Object result= transactionTemplate.execute (

       new TransactionCallback()

{

          public Object doInTransaction(TransactionStatus status)

{

 

              return resultObject;

           }

       }

    )*/

 

/*  DefaultTransactionDefinition def=new DefaultTransactionDefinition();

   TransactionStatus status=transactionManager.getTransaction(def);

   try

{

        JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);

        jdbcTemplate.update(“INSERT INTO book VALUES(1,’gf’,’Mastering Spring’)”);

   }

   catch(DataAccessException ex)

{

       transactionzManager.rollback(status);

       throw ex;

   }

    finally

   {

       transactionManager.commit(status);

   } */

// 使用下面的代码替换上面注释掉的部分

     JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);

    jdbcTemplate.update(“INSERT INFO book VALUES(1,’gf’,’Mastering Spring’)”);

/ / 相比,此段代码省去了 commit rollback 事务处理语句;与 相比,不必实现 TransactionCallback 接口

}

}

2 )配置文件

 "">

   dataSource à

  

      使用SQL Server à

      

          com.microsoft.jdbc.sqlserver.SQLServerDriver

      

       

          jdbc:Microsoft:sqlserver://localhost:1433/stdb

      

          admin

      

          admin

      

   

 

    设定 transactionManager à

   

class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”>

       

           

       

   

 

   示例中 DAO-->

   

       

           

       

     与编程式事务处理相比,在 DAO 设置中去掉了这个属性,把它放到了代理类中。 - à

 

      

           

        - à

 

  

   声明式事务处理 - à

  

       

           

        

           

       

           

               

阅读(3376) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~