Spring中的事务回滚
if(userSave){
try {
userDao.save(user);
userDao.save(user);
} catch (Exception e) {
logger.info("信息重复:"+e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚。
spring aop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常,但可以通过配置来捕获特定的异常并回滚
如果Service层会抛出不属于运行时异常也要能回滚,那么可以将Spring默认的回滚时的异常修改为Exception,这样就可以保证碰到什么异常都可以回滚。
@Transactional(rollbackFor=Exception.class)