之前对于spring事务的理解一直错误的以为”在try捕获异常时开启事务,在catch块中回滚事务”:
public void saveUser(User user){
try{
事务开启
userDao.save(user)
}catch(Exception e){
事务回滚
}
}
或许是之前控制事务都是出于业务层,并且在捕获异常之后都有向上抛的原因没有出现事务失效问题,但今天一段代码中就出现了如上对事务进行处理了但没有抛出的情况,结果就是事务失效没有回滚。找了很久,最后才发现spring回滚事务是在RuntimeException未处理的情况下才会回滚:
public void saveUser(User user)throws Exception{
userDao.save(user);
}
或者
public void saveUser(User user)throws Exception{
try{
userDao.save(user);
}catch(Exception e){
throw new Exception();
}
}
总结:
spring 事务只在发生未被捕获的runtimeException异常时回滚,需要在抛出自定义异常时回滚时,需要配置事务的rollback-for=”自定义异常”。