Spring 的事务处理

一、概述

(一)基本概念

1 、什么是Spring事务处理?

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


2 、两种事务处理方式

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


(二)框架图

实现事务处理的两种方式


Java 动态代理


CGLIB



两种事务处理方式


编程式事务处理


声明式事务处理



(三)何时使用什么

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


二、详细

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


(一)编程式事务处理

1 、使用TransactionTemplate进行事务处理(Spring进行commit和rollback)

          ( 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 方法,就是在这个方法里写数据库新增数据的操作


          new TransactionCallback()


{


          public Object doInTransaction(TransactionStatus status)


{


              // 数据库操作代码


              return resultObject;


           }


       }


[U1]       )


}


}


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


        new TransactionCallback WithoutResult ()


{


          public Object doInTransaction WithoutResult (TransactionStatus status)


{


              // 数据库操作代码


            


           }


       }



( 2 )配置文件


<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"


 "http://www.springframework.org/dtd/spring-beans.dtd">


<beans>


   <!— 设 定dataSource à


   <bean id=”dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>


      <!— 使用SQL Server 数 据 库 à


       <property name=”driverClassName”>


          <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>


       </property>


        <property name=”url”>


          <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>


       </property>


<property name=”name”>


          <value>admin</value>


       </property>


<property name=”msg”>


          <value>admin</value>


       </property>


    </bean>



    <!— 设定 transactionManager à


    <bean id=”transactionManager”


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


        <property name=”dataSource”>


            <ref bean=”dataSource”/>


        </property>


    </bean>



   <!— 示例中 DAO-->


    <bean id=”bookDAO” class=”com.bookDAO”>


        <property name=”dataSource”>


            <ref bean=”dataSource”/>


        </property>


        <property name=”transactionManager”>


            <ref bean=”transactionManager”>


        </property>


   </bean>


</beans>


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


2 、使用JdbcTemplate进行事务处理(硬编码进行commit和rollback)

( 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 )配置文件


<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"


 "http://www.springframework.org/dtd/spring-beans.dtd">


<beans>


   <!— 设 定dataSource à


   <bean id=”dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>


      <!— 使用SQL Server 数 据 库 à


       <property name=”driverClassName”>


          <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>


       </property>


        <property name=”url”>


          <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>


       </property>


<property name=”name”>


          <value>admin</value>


       </property>


<property name=”msg”>


          <value>admin</value>


       </property>


    </bean>



    <!— 设定 transactionManager à


    <bean id=”transactionManager”


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


        <property name=”dataSource”>


            <ref bean=”dataSource”/>


        </property>


    </bean>



   <!— 示例中 DAO-->


    <bean id=”bookDAO” class=”com.bookDAO”>


        <property name=”dataSource”>


            <ref bean=”dataSource”/>


        </property>


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



    <!—    <property name=”transactionManager”>


            <ref bean=”transactionManager”>


        </property> - à



   </bean>


   <!— 声明式事务处理 - à


   <bean id=”bookDAOProxy” class=”org.springframework.transaction.interceptor.Transation.ProxyFactoryBean”>


        <property name=”transacionManager”>


            <ref bean=”transacionMaganer”/>


        </property>


<property name=”target”>


            <ref bean=”bookDAO”/>


        </property>


<property name=”transactionAttributes”>


            <props>


               <!-- 表示对 bookDAO 中的 create 方法进行事务处理,并指明当前没有事务就新建一个(用 PROPAGATION_REQUIRED 常量来表示的) à


                <prop key=”create * ”>PROPAGATION_REQUIRED</prop>


            </props>


        </property>  


   </bean>


</beans>

猜你喜欢

转载自blog.51cto.com/14028890/2392783