美文网首页springjava
@Transactional注解的rollbackFor属性

@Transactional注解的rollbackFor属性

作者: 修行者12138 | 来源:发表于2020-07-03 20:22 被阅读0次

    先回忆下java的异常模型,Throwable是最顶层的父类,有Error和Exception两个子类。
    Error表示严重的错误(如OOM等);
    Exception可以分为运行时异常(RuntimeException及其子类)和非运行时异常(Exception的子类中,除了RuntimeException及其子类之外的类)。

    非运行时异常是检查异常(checked exceptions),一定要try catch,因为这类异常是可预料的,编译阶段就检查的出来;
    Error和运行时异常是非检查异常(unchecked exceptions),不需要try catch,因为这类异常是不可预料的,编辑阶段不会检查,没必要检查,也检查不出来

    image.png

    spring的@Transactional注解可以很方便的开启事务,但是默认只在遇到运行时异常和Error时才会回滚,非运行时异常不回滚,即Exception的子类中,除了RuntimeException及其子类,其他的类默认不回滚(不知道为什么要这样设计?)
    而rollbackFor属性可以解决这个问题,rollbackFor = Exception.class表示Exception及其子类的异常都会触发回滚,同时不影响Error的回滚。

    image.png

    下面是关于@Transactional注解的一些实验

    实验一
    不加rollbackFor属性,抛出RuntimeException,正常回滚

        @Transactional
        public void save(){
            StudentDO studentDO = new StudentDO();
            studentDO.setName("ltm");
            studentDO.setAge(22);
            studentMapper.insert(studentDO);
    
            throw new RuntimeException("我是异常");
        }
    

    实验二
    不加rollbackFor属性,抛出IOException,不回滚

        @Transactional
        public void save() throws IOException{
            StudentDO studentDO = new StudentDO();
            studentDO.setName("ltm");
            studentDO.setAge(22);
            studentMapper.insert(studentDO);
    
            throw new IOException();
        }
    

    实验三
    加上rollbackFor = Exception.class,抛出IOException,正常回滚

        @Transactional(rollbackFor = Exception.class)
        public void save() throws IOException{
            StudentDO studentDO = new StudentDO();
            studentDO.setName("ltm");
            studentDO.setAge(22);
            studentMapper.insert(studentDO);
    
            throw new IOException();
        }
    

    实验四
    不加rollbackFor属性,抛出OutOfMemoryError,正常回滚

        @Transactional()
        public void save(){
            StudentDO studentDO = new StudentDO();
            studentDO.setName("ltm");
            studentDO.setAge(22);
            studentMapper.insert(studentDO);
    
            throw new OutOfMemoryError();
        }
    

    实验五
    加上rollbackFor = Exception.class,抛出OutOfMemoryError,正常回滚,说明rollbackFor = Exception.class不会覆盖Error的回滚

        @Transactional(rollbackFor = Exception.class)
        public void save(){
            StudentDO studentDO = new StudentDO();
            studentDO.setName("ltm");
            studentDO.setAge(22);
            studentMapper.insert(studentDO);
    
            throw new OutOfMemoryError();
        }
    

    相关文章

      网友评论

        本文标题:@Transactional注解的rollbackFor属性

        本文链接:https://www.haomeiwen.com/subject/gscpqktx.html