在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