【发布时间】:2015-10-14 20:18:52
【问题描述】:
目前,我们有一个调用事务服务的 grails 作业。当服务抛出异常时,hibernate 的行为会变得很奇怪。我们正在使用 grails 2.4.4 和 hibernate:3.6.10.18。
所以在我的工作中,我在执行方法上有这个:
Model.withTransaction { ->
try {
service.updateDatabase()
service.method()//throws runtime exception
} catch(RuntimeException e) {
//do something
}
}
奇怪的是,updateDatabase 操作确实会回滚。查看日志,我可以验证它是否在 catch 块中通过,但仍然日志表明仍然抛出异常。我认为这就是交易回滚的原因。
但是,如果我直接在作业中抛出RuntimeException,它不会回滚数据库事务并且会干净地捕获异常。在我的印象中,这应该是正确的行为,应该和从服务内部抛出异常一样。
Model.withTransaction { ->
try {
service.updateDatabase()
throw new RuntimeException()
} catch(RuntimeException e) {
//do something
}
}
这正常吗? 这是一个错误吗?
【问题讨论】:
-
我不明白你的问题,如果你能帮我解决它,我就能帮你。首先你说“奇怪的是,updateDatabase 操作没有回滚”,然后“我认为这就是事务回滚的原因。”。帮助我了解 updateDatabase 是否回滚。
-
@juandiegoh 抱歉打错字了,我更新了问题。
-
我回答了我认为是您的问题,但我仍然不明白。您的案例不会回滚,您认为“正确的行为”也不会回滚。
-
@juandiegoh 再次道歉,我的问题已得到更正
标签: hibernate grails grails-orm quartz-scheduler