先回憶下java的異常模型朱躺,Throwable是最頂層的父類(lèi),有Error和Exception兩個(gè)子類(lèi)宇弛。
Error表示嚴(yán)重的錯(cuò)誤(如OOM等)源请;
Exception可以分為運(yùn)行時(shí)異常(RuntimeException及其子類(lèi))和非運(yùn)行時(shí)異常(Exception的子類(lèi)中,除了RuntimeException及其子類(lèi)之外的類(lèi))舅踪。
非運(yùn)行時(shí)異常是檢查異常(checked exceptions)良蛮,一定要try catch,因?yàn)檫@類(lèi)異常是可預(yù)料的决瞳,編譯階段就檢查的出來(lái);
Error和運(yùn)行時(shí)異常是非檢查異常(unchecked exceptions)痴颊,不需要try catch屡贺,因?yàn)檫@類(lèi)異常是不可預(yù)料的,編輯階段不會(huì)檢查甩栈,沒(méi)必要檢查,也檢查不出來(lái)
玉转。
spring的@Transactional注解可以很方便的開(kāi)啟事務(wù)允蜈,但是默認(rèn)只在遇到運(yùn)行時(shí)異常和Error時(shí)才會(huì)回滾,非運(yùn)行時(shí)異常不回滾
漩蟆,即Exception的子類(lèi)中妓蛮,除了RuntimeException及其子類(lèi),其他的類(lèi)默認(rèn)不回滾(不知道為什么要這樣設(shè)計(jì)蛤克?)
而rollbackFor屬性可以解決這個(gè)問(wèn)題构挤,rollbackFor = Exception.class表示Exception及其子類(lèi)的異常都會(huì)觸發(fā)回滾,同時(shí)不影響Error的回滾筋现。
下面是關(guān)于@Transactional注解的一些實(shí)驗(yàn)
實(shí)驗(yàn)一
不加rollbackFor屬性矾飞,拋出RuntimeException,正橙髀伲回滾
@Transactional
public void save(){
StudentDO studentDO = new StudentDO();
studentDO.setName("ltm");
studentDO.setAge(22);
studentMapper.insert(studentDO);
throw new RuntimeException("我是異常");
}
實(shí)驗(yàn)二
不加rollbackFor屬性,拋出IOException瞒津,不回滾
@Transactional
public void save() throws IOException{
StudentDO studentDO = new StudentDO();
studentDO.setName("ltm");
studentDO.setAge(22);
studentMapper.insert(studentDO);
throw new IOException();
}
實(shí)驗(yàn)三
加上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();
}
實(shí)驗(yàn)四
不加rollbackFor屬性肴焊,拋出OutOfMemoryError,正橙⒕欤回滾
@Transactional()
public void save(){
StudentDO studentDO = new StudentDO();
studentDO.setName("ltm");
studentDO.setAge(22);
studentMapper.insert(studentDO);
throw new OutOfMemoryError();
}
實(shí)驗(yàn)五
加上rollbackFor = Exception.class届宠,拋出OutOfMemoryError乘粒,正成怂回滾,說(shuō)明rollbackFor = Exception.class不會(huì)覆蓋Error的回滾
@Transactional(rollbackFor = Exception.class)
public void save(){
StudentDO studentDO = new StudentDO();
studentDO.setName("ltm");
studentDO.setAge(22);
studentMapper.insert(studentDO);
throw new OutOfMemoryError();
}