Spring事务不生效的情况之一(同一个类中,一个有事务方法调用另一个没有事务的在其子类实现的方法)

问题起源

源于公司里一个程序员妹子最近在添加事物的时候遇到了些问题找我帮忙,说事物添加了怎么也不生效,下面直接用例子说明这种不生效的情况:

栗子说明

首先有个父类,在父类中有一个添加事物的方法,和一个没有事物的方法

public class TranClassA {

    @Transactional
    public void doExecute(){
        //JDBC JDBC
        methodB();
    }

    public void methodB(){}
}

有一个子类继承了TranClassA 类,并重写父类的methodB()方法

public class TranClassB extends TranClassA {

    @Override
    public void methodB(){
        //JDBC JDBC
    }
}

此时在调用methodB()时事务是不会生效的

原因分析

Transactional事务是基于Spring的aop机制,在spring aop的用法中,只有代理的类才会被切入

解决办法

通过代理方法调用methodB

首先确认spring的配置文件中已开启aop代理

    
    

使用代理调用方法

public class TranClassA {

    @Transactional
    public void doExecute(){
        //JDBC JDBC
		//methodB();
        ((TranClassA)AopContext.currentProxy()).methodB();
    }

    public void methodB(){}
}

你可能感兴趣的:(java)