问题描述:
在ClassA类中有方法MethodA,由于业务需要MethodA需要自行处理异常,同时还要保证事物,一开始我是这样写的:
public class classA implementes IclassA {
public void MethodA(){
try{
//处理业务
dealBusiness1();
dealBusiness2();
}catch(Exception e){
//输出异常
}
}
}
很显然上面的代码无法保证业务在同一个事物中,当dealBusiness1成功,dealBusiness2失败时,dealBusiness1并不会回滚,然后想将业务代码放到方法MethodB中,在方法MethodB上面使用事物,如下:
public class classA implementes IclassA {
public void MethodA(){
try{
//调用methodB处理业务
this.MethodB();
}catch(Exception e){
//输出异常
}
}
@Transcational
public void MethodB(){
//处理业务,有异常直接抛出
dealBusiness1();
dealBusiness2();
}
}
修改成上面的例子之后,在MethodA方法中调用MethodB还是无法创建事物,但是直接调用MethodB却可以。所以揣测在MethodA方法中调用MethodB时,不能使用this,需要另创建实例调用MethodB,修改如下:
public class classA implementes IclassA {
@AutoWired
private IclassA iclassA;
public void MethodA(){
try{
//调用methodB处理业务
//this.MethodB();//不能使用this调用
iclassA.MethodB();
}catch(Exception e){
//输出异常
}
}
@Transcational
public void MethodB(){
//处理业务,有异常直接抛出
dealBusiness1();
dealBusiness2();
}
}
修改成上面的样子之后,在MethodA中调用MethodB创建事物成功,所有业务逻辑全部在MethodB中,这样要成功全部成功,要失败全部失败,在MethodA中也可以捕获到异常信息。
当然你也可以再新建一个类,将MethodB移动到新类中,MethodA中调用新类的MethodB,道理和新创建一个classA实例相同。
注意:注解事物默认只捕获uncheck的异常,当然也可以添加属性指定要捕获的异常,在使用默认的情况下,可以在MethodB中捕获异常,然后转换为RuntimeException异常。
网友评论