我正在尝试对 Hibernate 引发的乐观锁类型异常实现异常处理,但我遇到了一个奇怪的问题。看来我无法捕获任何 Gorm 异常。
例如,我的服务中有以下代码:
try {
User user = User.get(1);
Thread.sleep(10000);
user.viewedAt(new Date());
user.save(flush:true);
} catch (OptimisticLockingException ex) {
log.error("Optimistic lock exception");
} catch (StaleObjectStateException ex) {
log.error("Optimistic lock exception");
}
当我用两个线程命中此块时,它会爆炸并且异常会传播到 Grails 的标准异常处理程序。即使报告的异常是,catch 块也永远不会被调用StaleObjectStateException
.
我注意到我can如果我让它传播到控制器并在那里捕获它,则捕获异常,但似乎我无法在服务中实现异常处理,这很奇怪。
我缺少什么?
我已经了解了这一点,并将其发布,以防其他人遇到此问题。出现此问题的原因是 try/catch 块位于事务服务中。尽管grails报告在执行期间抛出了异常save()
调用,实际上它被称为AFTER提交事务时的整个方法。
所以看来:
-
flush: true
对交易服务没有影响
- 在事务服务中捕获 GORM 相关的异常是不可能的,至少在不做一些工作的情况下是不可能的
我最终通过自己手动管理交易来解决这个问题,即
try {
User.withNewTransaction {
User user = User.get(id); // Must reload object
.. // do stuff
user.save(flush:true)
}
} catch (OptimisticLockingException ex) {
...
}
我希望这对其他人有用!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)