事务

作者: 追风的云月 | 来源:发表于2023-01-12 16:21 被阅读0次
    1. https://blog.csdn.net/weixin_44771989/article/details/123967275
    异常类型

    Exception 有checked和uncheck:
    RuntimeException
    IOException

    throw 和 throws

    事务和异常的关系

    默认spring事务只在发生未被捕获的RuntimeException时才回滚。
    springaop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获RuntimeException的异常,但可以通过配置来捕获特定的异常并回滚;

    如果发生异常,那么产生回滚
    如果将出错的方法或者SQL try catch 不回滚
    如果调用该方法的方法 不 try catch 则会被该方法抛出的异常影响 可能导致回滚

    新建一个事务,当前事务存在,把当前事务挂起
    updateSchool方法更新id为1的name为“湖南大学”,location为“湖南”,有事务,打印1/0,报错;

        @Transactional
        public void updateSchool(){
            School school = new School();
            school.setId(1);
            school.setName("湖南大学");
            school.setLocation("湖南");
            schoolMapper.updateByPrimaryKeySelective(school);
            studentService.updateStudent();
            System.out.println(1/0);
        }
    

    updateStudent方法更新id为1的age为25,事务传播机制为REQUIRES_NEW;

        @Transactional(propagation = Propagation.REQUIRES_NEW)
        public void updateStudent(){
            Student student = new Student();
            student.setSid(1);
            student.setAge(25);
            studentMapper.updateByPrimaryKeySelective(student);
        }
    

    如上所示:updateSchool方法有加事务,studentService.updateStudent方法加了事务,而且传播机制是REQUIRES_NEW,如果updateStudent方法新建了另一个事务,updateSchool报错,updateStudent不会回滚,如果不是新建一个事务而是共用一个事务,就会一起回滚;
    ————————————————
    使用场景:被调用方法,不想因为调用方出错而回滚,可以使用REQUIRES_NEW;

    相关文章

      网友评论

          本文标题:事务

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