春季@Transactional继承规则
2022-09-01 23:45:21
我有一组从抽象类继承核心功能的bean。我用 和 标记了每个具体的子类服务。抽象超类包含其中每个服务的公共入口点方法。换句话说,我有类似于以下内容的东西:@Service
@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
}
}
每个具体子类服务中的特定代码对 DAO 层进行多次调用,以对数据库进行更改,这些更改具有事务传播类型。REQUIRED
现在,使用如上所述定义的服务,我发现这些具体子类服务的任何代码中都没有当前事务,并且对DAO层的每次调用都在创建一个新事务,进行更改,提交事务并返回。
但是,如果我用 注释抽象超类,则正确创建事务,并且对 DAO 层的子调用都参与当前事务。@Transactional
所以我的问题是,继承行为的规则是什么?为什么Spring没有使用它实际实例化的具体子类服务?在这种情况下,是否需要在超类上,因为这是公共入口点方法的位置?@Transactional
@Transactional
@Transactional