在下面的示例中,我成功地落入终点 - mandatory()
- 尽管两个互斥的@Transactional
注释中的一个必须抛出异常:Propagation.NEVER
还是{{1} }。但代码执行成功。
怎么可能?!
我的一对(不是全部)服务受此影响,我想了解原因是什么。
Propagation.MANDATORY
Grails 2.2.0
答案 0 :(得分:4)
看起来你正在绕过bean代理,因为Burt Beckwith(幻灯片23)称它为“无意中绕过bean代理”。
你需要获取代理并执行你的方法。
@Transactional(propagation = Propagation.NEVER)
boolean never() {
def myproxy= grailsApplication.mainContext.newService
return myproxy.mandatory()
}
@Transactional(propagation = Propagation.MANDATORY)
boolean mandatory() {
// successfully breakpointed here o_O
return true
}
答案 1 :(得分:2)
Spring声明式事务是基于AOP的。而Spring AOP是基于代理的。这意味着当从另一个 bean通过代理调用bean时,将读取事务注释并将其考虑在内:
Bean A --> injected transactional proxy --> Bean B
在您的情况下,您直接调用同一个bean的另一个方法。因此,事务代理不知道此调用,因此无法强制执行事务:
Bean A --> this