Spring 事物 同一个类中不同方法调用

问题描述:
在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异常。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容