Spring的事务处理

    技术2022-05-11  90

    一)编程式事务处理

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

              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进行事务处理(硬编码进行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 )配置文件

    <?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>

     

     

    最新回复(0)