我们有:
@Transactional(propagation = Propagation.REQUIRED)
public class MyClass implementes MyInterface { ...
MyInterface有一个方法:go()
。
当执行go()时,我们会启动一个新的事务,在方法完成时进行提交/回滚 - 这很好。
现在假设在go()中,我们调用了MyClass中具有@Transactional(propagation = Propagation.REQUIRES_NEW
的私有方法。似乎Spring“忽略”REQUIRES_NEW注释,并且不会启动新事务。我相信这是因为Spring AOP在接口级别(MyInterface)上运行,并且不拦截对MyClass方法的任何调用。这样说是否正确?
有没有办法在go()事务内启动新事务?唯一的方法是调用另一个已配置为REQUIRES_NEW的Spring管理bean吗?
更新:添加说明,当客户端执行go()
时,他们是通过接口引用而不是类来执行的:
@Autowired
MyInterface impl;
impl.go();
@Transactional
在MyClass的公共方法上,似乎Spring也不会拾取它,除非该方法在接口中定义 - 正确吗? - Marcus LeonMyClass
实现了一个接口,那么Spring将仅使用该接口来生成事务代理,甚至会忽略公共的非接口方法。但是,如果MyClass
没有实现任何接口,则所有公共方法都将被使用。 - skaffman@Autowired
依赖项。 - flob