Spring如何设置让事务自动提交和回滚?Spring两种事务管理方式的配置及使用

来源:互联网 发布:转播权包括网络转播吗 编辑:程序博客网 时间:2024/06/09 20:58

更多spring事务问题请访问链接:Spring事务回滚疑难详解

1,我们要明确,Spring如何设置让事务自动提交和回滚?

       ①如何自动提交?

          理论上,可以通过对DataSource如下设置,让事务自动提交

[html] view plain copy
  1. <!-- 配置数据源 -->  
  2. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">                
  3.    <property name="defaultAutoCommit" value="true"></property>  
  4. </bean>  

          实际上,这个设置对于大多数数据源是没有必要的,例如"org.apache.commons.dbcp.BasicDataSource"

        (我们可以通过反编译插件或者反编译工具浏览该jar包),我们发现

[java] view plain copy
  1.  public BasicDataSource() {  
  2.     this.defaultAutoCommit = true;  
  3.     this.defaultReadOnly = null;  
  4. /*此类通过无参的构造方法实例化:new BasicDataSource()*/  

         上述表明:该数据源通过构造方法,初始化成员变量,defaultAutoCommit默认为true。

        

     ②如何自动回滚?


         详情访问链接:Spring事务为什么没有回滚?Spring事务怎样才会回滚?事务回滚的条件


2,想要Spring对事务实现自动管理,首先我们要为数据源配置事务管理器


        SSH中配置如下:

[html] view plain copy
    1. <!-- 配置数据源 -->  
    2. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">   
    3.     <property name="driverClassName" value="${jdbc_driverClassName}"></property>  
    4. </bean>  

  1. <!-- 配置SessionFactory -->  
  2. <bean id="sessionFactory"    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  
  3.     <property name="dataSource" ref="dataSource" />     
  4. </bean>  
  5. <!-- 配置一个事务管理器 -->  
  6. <bean id="transactionManager"  
  7.     class="org.springframework.orm.hibernate4.HibernateTransactionManager">  
  8.     <property name="sessionFactory" ref="sessionFactory" />  
  9. </bean>  
       SSM中配置如下:
[html] view plain copy
  1. <!-- 配置数据源 -->  
  2. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">   
  3.     <property name="driverClassName" value="${jdbc_driverClassName}"></property>  
  4. </bean>  
  5.   
  6. <!-- 配置事务管理器 -->   
  7. <bean name="transactionManager"  
  8.     class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  9.     <property name="dataSource" ref="dataSource" />  
  10. </bean>  

         总结:Mybatils与hibernate在事务管理配置上有差别 —— Mybatils通常使用Spring默认的数据源事务管理器只要求相同数据源,不做其他配置;Hibernate使用专门的Spring事务管理器需要引用具备相同数据源的SessionFactory。

            

3,Spring的事务管理方式有哪几种?如何配置并使用?(事务管理器创建完成,以它为基础配置事务标识——用来创建并管理事务)

         

           包含两种: 编程式事务管理声明式事务管理


              (一)其中编程式管理带来代码冗余,违背Spring简洁特性,基本上很少使用,例如:

          

  1.     int a=consumpDao.insert(s);//插入消费明细  
  2.     int b=customerDao.insert(customer);//此处实际应该update(customer),不然会出现重复主键的异常  
  3.     int d=0;  
  4.     if(a*b*d==1){  
  5.         json.put("result",0);  
  6.         json.put("msg""购买成功");  
  7.         json.put("data""");  
  8.     }else{  
  9.         json.put("result",-1);  
  10.         json.put("msg""购买失败");  
  11.         json.put("data""");  
  12.         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();  
  13.     }  

                其中使用程序TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 在没有异常抛出的情况下实现

    事务的手动回滚,如有疑问请访问链接:Spring事务为什么没有回滚?Spring事务怎样才会回滚?事务回滚的条件


       注意:尽管可以采用编程式方法回滚事务,但“回滚”只是事务的生命周期之一,所以要么编程实现事务的全部必要周期,要么仍要

           配置务切点,即,将事务管理的其他周期交由Spring的标识!


          (二)其中声明式管理符合Spring的特性,被广泛使用 —— 注解易于配置,配置易于编程 ,它的实现具有两种常用方式:

                

                ①一种是基于tx和aop切面拦截的xml配置文件:

[html] view plain copy
  1. <tx:advice id="transactionAdvice" transaction-manager="transactionManager">   
  2. <!-- 切点拦截的位置下,所有形式类似的方法名,‘事务’都会交由相应事务管理工具管理-->  
  3.     <tx:attributes >  
  4.         <tx:method name="insert*" propagation="REQUIRED"  />  
  5.         <tx:method name="get*" propagation="REQUIRED" read-only="true" />  
  6.     </tx:attributes>  
  7. </tx:advice>  
  8. <aop:config expose-proxy="true">  
  9.     <aop:pointcut id="transactionPointcut" expression="execution(* com.local.*.*.*(..))" />  
  10.     <aop:advisor pointcut-ref="transactionPointcut"  advice-ref="transactionAdvice" />  
  11. </aop:config>  
                需要注意一下expression中*通配符的含义:

[html] view plain copy
  1. <!-- 对所有层的事务方法进行切点拦截 *的含义:①所有返回类型 ②所有包③所有类 ④所有方法(..)标识方法内的所有参数  -->  
                当然,大多数时候我们都是在service层,实现事务管理的,即配置如下:
[html] view plain copy
  1. <aop:config expose-proxy="true">  
  2.     <aop:pointcut id="transactionPointcut" expression="execution(* com.local.service.*.*(..))" />  
  3.     <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" />  
  4. </aop:config>  
                只要在expression描述的范围下,方法名符合配置格式,事务的 ①开启  ②提交  ③回滚   ④关闭  ⑤清空就会依据具体配置交由Spring管理:

[java] view plain copy
  1. @RequestMapping("consump")  
  2. public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{        
  3.     JSONObject json =new JSONObject();  

               ②另一种就是基于@Transactional注解:

[html] view plain copy
  1. <!-- 注解方式配置事物 -->  
  2.     <tx:annotation-driven transaction-manager="transactionManager" />   
              @Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。

[java] view plain copy
  1. @Transactional  
  2. @RequestMapping("consump")  
  3. public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{        
  4.     JSONObject json =new JSONObject();  
原创粉丝点击