我有一组继承自抽象类的@Service
bean。我用 @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层的每个调用都会创建一个新的事务,进行更改,提交事务并返回。
然而,如果我在抽象超类上注释
@Transactional
,则事务将正确地创建,并且对DAO层的子调用都参与当前事务。因此,我的问题是,继承
@Transactional
行为的规则是什么?为什么Spring不在实际实例化的具体子类服务上使用@Transactional
?在这种情况下,@Transactional
是否需要在超类上,因为那里是公共入口点方法?
processSpecific()
这样调用DAO的东西,标记子类@ Transactional也不会使进程似乎有Txn打开。 - redzedi