事务

  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;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容