哪些场景事务不会回滚

Spring事务框架默认只在抛出RuntimeException和unchecked exceptions时才将事务回滚(Errors默认 - 事务回滚),但是抛出的Checked exceptions时将不进行事务回滚。

如果我们希望改变这个默认情况,可以按场景做设置:

  1. 抛出checked exceptions时也回滚事务:@Transactional(rollbackFor=Exception.class)
  2. 抛出unchecked excepitons时不回滚事务:@Transactional(notRollbackFor=RunTimeException.class)
  3. 不需要事务管理:@Transactional(propagation=Propagation.NOT_SUPPORTED)

注意:如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}

示例:-------------------------------------------------------------------------------------

spring事务不会进行回滚的情况

 

if(userSave){          
    try {         
        userDao.save(user);          
        userCapabilityQuotaDao.save(capabilityQuota);         
     } catch (Exception e) {          
        logger.info("能力开通接口,开户异常,异常信息:"+e);         
     }         
 }  

 

类似上面这样的方法不会回滚 (一个方法出错,另一个方法不会回滚) 

 

 

下面的方法回滚(一个方法出错,另一个方法会回滚):

if(userSave){         
     try {          
        userDao.save(user);          
        userCapabilityQuotaDao.save(capabilityQuota);         
       } catch (Exception e) {         
        logger.info("能力开通接口,开户异常,异常信息:"+e);          
        throw new RuntimeException();         
     }          
}  

 

 

if(userSave){          
    try {          
        userDao.save(user);          
        userCapabilityQuotaDao.save(capabilityQuota);          
    } catch (Exception e) {          
        logger.info("能力开通接口,开户异常,异常信息:"+e);          
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();         
    }         
 }  

为什么不会滚呢??是对Spring的事务机制就不明白。!! 
   默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚。  
   spring aop  异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常,但可以通过  
    
配置来捕获特定的异常并回滚  
  换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被aop捕获进而回滚

你可能感兴趣的:(高并发难点)