异常类型
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;