Grails:Spring的@Transactional注释有时会被忽略

时间:2013-08-14 13:15:29

标签: spring grails transactions

在下面的示例中,我成功地落入终点 - mandatory() - 尽管两个互斥的@Transactional注释中的一个必须抛出异常:Propagation.NEVER还是{{1} }。但代码执行成功。

怎么可能?!

我的一对(不是全部)服务受此影响,我想了解原因是什么。

Propagation.MANDATORY

Grails 2.2.0

2 个答案:

答案 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