Dun*_*ear 17 java service spring transactional
我有一组@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
}
}
Run Code Online (Sandbox Code Playgroud)
每个具体子类服务中的特定代码对DAO层进行多次调用以对数据库进行更改,这些更改具有REQUIRED
事务传播类型.
现在使用上面定义的服务,我发现在这些具体的子类服务的任何代码中都没有当前事务,并且每次调用DAO层都是创建一个新事务,执行更改,提交事务和返回.
但是,如果我注释抽象超类@Transactional
,那么交易是正确创建,和子调用DAO层所有参与当前事务.
所以我的问题是,继承@Transactional
行为的规则是什么?为什么Spring不使用@Transactional
它实际实例化的具体子类服务?@Transactional
在这种情况下是否需要在超类上,因为那是公共入口点方法的地方?
Kat*_*hir 12
从spring交易文档中,
注意:在代理模式(默认设置)下,只会拦截通过代理进入的"外部"方法调用.这意味着'自调用',即目标对象中调用目标对象的其他方法的方法,即使被调用的方法用@Transactional标记,也不会在运行时导致实际的事务!
即使您在具体实现上有@Transactional并且您正在通过注释调用实际上是事务性的进程方法,但是由于此内部调用,在子类上调用processSpecific的进程方法不是事务性的.
看看编织.