这个为什么能回滚?异常都不一样

这个为什么能回滚?异常都不一样
这个为什么能回滚?异常都不一样
这个为什么能回滚?异常都不一样

img

1.这个原因是因为Spring默认会catch到RuntimeException和Error级别的异常,因为你指定的异常是ArithmeticException,而抛出的异常时NullPoint,它并不是ArithmeticException的子类,所以会被Runtime级别的异常catch到,依旧回滚
org.springframework.transaction.interceptor.DefaultTransactionAttribute

@Override
    public boolean rollbackOn(Throwable ex) {
        return (ex instanceof RuntimeException || ex instanceof Error);
    }

2.但是如果抛出的是Exception,那么只写指定的异常都不能catch到它,就不会回滚

@Transactional(rollbackFor = ArithmeticException.class)
    public void saveFooOne() throws Exception{
        jdbcTemplate.update("INSERT INTO FOO (BAR) VALUES (?)", "rollback");
        throw new Exception();
    }

空指针异常,他本来就是运行时异常,@Transactional注解spring会回滚所有的运行时异常及其子类异常

noRollbackFor 参数为不会导致事务回滚的异常类数组
你是需要这个吧