異常類型
Exception 有checked和uncheck:
RuntimeException
IOException
throw 和 throws
事務(wù)和異常的關(guān)系
默認(rèn)spring事務(wù)只在發(fā)生未被捕獲的RuntimeException時(shí)才回滾。
springaop 異常捕獲原理:被攔截的方法需顯式拋出異常,并不能經(jīng)任何處理,這樣aop代理才能捕獲到方法的異常,才能進(jìn)行回滾,默認(rèn)情況下aop只捕獲RuntimeException的異常,但可以通過配置來捕獲特定的異常并回滾;
如果發(fā)生異常,那么產(chǎn)生回滾
如果將出錯(cuò)的方法或者SQL try catch 不回滾
如果調(diào)用該方法的方法 不 try catch 則會(huì)被該方法拋出的異常影響 可能導(dǎo)致回滾
新建一個(gè)事務(wù),當(dāng)前事務(wù)存在,把當(dāng)前事務(wù)掛起
updateSchool方法更新id為1的name為“湖南大學(xué)”,location為“湖南”,有事務(wù),打印1/0,報(bào)錯(cuò);
@Transactional
public void updateSchool(){
School school = new School();
school.setId(1);
school.setName("湖南大學(xué)");
school.setLocation("湖南");
schoolMapper.updateByPrimaryKeySelective(school);
studentService.updateStudent();
System.out.println(1/0);
}
updateStudent方法更新id為1的age為25,事務(wù)傳播機(jī)制為REQUIRES_NEW;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateStudent(){
Student student = new Student();
student.setSid(1);
student.setAge(25);
studentMapper.updateByPrimaryKeySelective(student);
}
如上所示:updateSchool方法有加事務(wù),studentService.updateStudent方法加了事務(wù),而且傳播機(jī)制是REQUIRES_NEW,如果updateStudent方法新建了另一個(gè)事務(wù),updateSchool報(bào)錯(cuò),updateStudent不會(huì)回滾,如果不是新建一個(gè)事務(wù)而是共用一個(gè)事務(wù),就會(huì)一起回滾;
————————————————
使用場景:被調(diào)用方法,不想因?yàn)檎{(diào)用方出錯(cuò)而回滾,可以使用REQUIRES_NEW;