spring事务何时会自动回滚

在java中异常的基类为Throwable,他有两个子类xception与Errors。同时RuntimeException就是Exception的子类,只有RuntimeException才会进行回滚;java

1,Spring事务回滚机制是这样的:当所拦截的方法有指定异常抛出,事务才会自动进行回滚!编程

      咱们须要注意的地方有四点: 若是你在开发当中引入Spring进行事务管理,可是事务没能正常的自动回滚,能够对照下面四点,缺一不可!app

         ①被拦截方法-—— 注解式:方法或者方法所在类被@Transactional注解;.net

         ②异常—— 该方法的执行过程必须出现异常,这样事务管理器才能被触发,并对此作出处理;blog

        ③指定异常——  默认配置下,事务只会对Error与RuntimeException及其子类这些UNChecked异常,作出回滚。 通常的Exception这些Checked异常不会发生回滚(若是通常Exception想回滚要作出配置);事务

                    举例:实现通常异常的回滚:开发

                     注解式:io

      

@Transactional(rollbackFor=Exception.class)  

@RequestMapping("consump")  

public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{    



 }

  

         ④异常抛出—— 即方法中出现的指定异常,只有在被事务管理器捕捉到之后,事务才会据此进行事务回滚;class

                       1,不捕捉,会回滚:email

public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{                   

      int a=consumpDao.insert(s);  

     int b=customerDao.update(customer);       

}  

  

                       2,若是异常被try{}捕捉到,那么事务管理器就没法再捕捉异常,因此就没法作出反应,事务不回滚;

public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{  

   try{  

   

      }catch(RuntimeException){  

      }                      

}       

                                    

                        3,若是异常被try{}捕捉了,咱们还能够在Catch(){}中throw   new  RuntimeException(),手动抛出运行时异常供事务管理器捕捉;       

public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{  

     try{    

 

       }catch(){  

         throw new RuntimeException();  

        }                      

}  

 

2,在实际开发中,有时并无异常发生,可是因为事务结果未知足具体业务需求,因此咱们不得不手动回滚事务!

        有以下两种方法:

                    ①手动抛出异常(若是你没有配置通常异常事务回滚,请抛出运行时异常)  

    if(){   

    }else{     

        throw new RuntimeException();  

    }                 

 

                    ②编程式实现手动回滚
    if(){ 

   }else{       

      TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();  

    }  

  

 

转自:https://my.oschina.net/gaomq/blog/1580290?email=Xie.Chaoyue@outlook.com

相关文章
相关标签/搜索