Spring @Transactional继承规则

Dun*_*ear 17 java service spring transactional

我有一组@Servicebean从一个抽象类继承核心功能.我用@Service和标记了每个具体的子类服务@Transactional.抽象超类包含每个服务的公共入口点方法.换句话说,我有类似于以下内容:

abstract class AbstractService {

    public void process() {
        // Do common initialisation code here
        processSpecific();
        // Do common completion code here
    }

    abstract protected void processSpecific();
}


@Service @Transactional
public class FirstSpecificService extends AbstractService {
    protected void processSpecific() {
        // Do specific processing code here
    }
}


@Service @Transactional
public class SecondSpecificService extends AbstractService {
    protected void processSpecific() {
        // Do different specific processing code here
    }
}
Run Code Online (Sandbox Code Playgroud)

每个具体子类服务中的特定代码对DAO层进行多次调用以对数据库进行更改,这些更改具有REQUIRED事务传播类型.

现在使用上面定义的服务,我发现在这些具体的子类服务的任何代码中都没有当前事务,并且每次调用DAO层都是创建一个新事务,执行更改,提交事务和返回.

但是,如果我注释抽象超类@Transactional,那么交易正确创建,和子调用DAO层所有参与当前事务.

所以我的问题是,继承@Transactional行为的规则是什么?为什么Spring不使用@Transactional它实际实例化的具体子类服务?@Transactional在这种情况下是否需要在超类上,因为那是公共入口点方法的地方?

Kat*_*hir 12

从spring交易文档中,

注意:在代理模式(默认设置)下,只会拦截通过代理进入的"外部"方法调用.这意味着'自调用',即目标对象中调用目标对象的其他方法的方法,即使被调用的方法用@Transactional标记,也不会在运行时导致实际的事务!

即使您在具体实现上有@Transactional并且您正在通过注释调用实际上是事务性的进程方法,但是由于此内部调用,在子类上调用processSpecific的进程方法不是事务性的.

看看编织.

  • 但是代理不会是“FirstSpecificService”的实例吗?在这种情况下,系统将调用该实例的外部“process”方法,并且该实例本身被标记为“@Transactional”。我完全理解标记为“@Transactional”的内部私有或受保护方法不会影响事务,但这不是我所拥有的。我的整个 bean 被标记为“@Transactional”。 (2认同)