美文网首页Spring
Spring 事物 同一个类中不同方法调用

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

作者: 索隆大大 | 来源:发表于2017-02-25 20:19 被阅读107次

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

    相关文章

      网友评论

        本文标题:Spring 事物 同一个类中不同方法调用

        本文链接:https://www.haomeiwen.com/subject/ehenwttx.html