問題描述:
在ClassA類中有方法MethodA,由于業(yè)務(wù)需要MethodA需要自行處理異常疼阔,同時還要保證事物牺陶,一開始我是這樣寫的:
public class classA implementes IclassA {
public void MethodA(){
try{
//處理業(yè)務(wù)
dealBusiness1();
dealBusiness2();
}catch(Exception e){
//輸出異常
}
}
}
很顯然上面的代碼無法保證業(yè)務(wù)在同一個事物中胆剧,當dealBusiness1成功,dealBusiness2失敗時,dealBusiness1并不會回滾氛改,然后想將業(yè)務(wù)代碼放到方法MethodB中些举,在方法MethodB上面使用事物馒吴,如下:
public class classA implementes IclassA {
public void MethodA(){
try{
//調(diào)用methodB處理業(yè)務(wù)
this.MethodB();
}catch(Exception e){
//輸出異常
}
}
@Transcational
public void MethodB(){
//處理業(yè)務(wù),有異常直接拋出
dealBusiness1();
dealBusiness2();
}
}
修改成上面的例子之后脖母,在MethodA方法中調(diào)用MethodB還是無法創(chuàng)建事物士鸥,但是直接調(diào)用MethodB卻可以。所以揣測在MethodA方法中調(diào)用MethodB時谆级,不能使用this,需要另創(chuàng)建實例調(diào)用MethodB烤礁,修改如下:
public class classA implementes IclassA {
@AutoWired
private IclassA iclassA;
public void MethodA(){
try{
//調(diào)用methodB處理業(yè)務(wù)
//this.MethodB();//不能使用this調(diào)用
iclassA.MethodB();
}catch(Exception e){
//輸出異常
}
}
@Transcational
public void MethodB(){
//處理業(yè)務(wù),有異常直接拋出
dealBusiness1();
dealBusiness2();
}
}
修改成上面的樣子之后肥照,在MethodA中調(diào)用MethodB創(chuàng)建事物成功鸽凶,所有業(yè)務(wù)邏輯全部在MethodB中,這樣要成功全部成功建峭,要失敗全部失敗玻侥,在MethodA中也可以捕獲到異常信息。
當然你也可以再新建一個類亿蒸,將MethodB移動到新類中凑兰,MethodA中調(diào)用新類的MethodB,道理和新創(chuàng)建一個classA實例相同。
注意:注解事物默認只捕獲uncheck的異常边锁,當然也可以添加屬性指定要捕獲的異常姑食,在使用默認的情況下,可以在MethodB中捕獲異常茅坛,然后轉(zhuǎn)換為RuntimeException異常音半。