Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Grails中的HeuristicCompletionException可以被忽略吗?_Java_Spring_Exception_Grails_Transactions - Fatal编程技术网

Java Grails中的HeuristicCompletionException可以被忽略吗?

Java Grails中的HeuristicCompletionException可以被忽略吗?,java,spring,exception,grails,transactions,Java,Spring,Exception,Grails,Transactions,在我的grails应用程序中,我经常得到org.springframework.transaction.HeuristicCompletionException:Heuristic completion:结果状态回滚;嵌套异常为org.springframework.transaction.UnexpectedRollbackException:事务已回滚,因为它已标记为仅回滚。我不知怎的发现,当任何类型的异常发生在@Transactional注释的方法内,并在具有自己的@Transaction

在我的grails应用程序中,我经常得到org.springframework.transaction.HeuristicCompletionException:Heuristic completion:结果状态回滚;嵌套异常为org.springframework.transaction.UnexpectedRollbackException:事务已回滚,因为它已标记为仅回滚。我不知怎的发现,当任何类型的异常发生在@Transactional注释的方法内,并在具有自己的@Transactional的方法内调用时,就会发生这种情况。我的问题是,是否可以简单地捕获并忽略此异常?

我已经找到了解决方法,正如Sudhir在评论中建议的那样,我可以在其中一个方法中复制启发式完成问题,并发现为了不回滚服务使用的现有事务,我们按照以下方法创建新事务:

@Transactional
Class MyService {
@Transactional(propagation = PROPAGATION.REQUIRES_NEW)
def myMethod(){
throw new Exception();
}
}

注释@Transactional(propagation=propagation.REQUIRES_NEW)这将为该方法创建新事务并挂起现有事务。由于每次执行该方法时都会创建新事务,这对于大型多线程应用程序来说无疑是一个性能问题,因此我通过处理服务类中每个方法中所有可能的异常来缓解这一问题。这会更好。

这意味着交易被回滚,您无需做任何事情。我随机收到此问题,任何临时问题都可能导致交易回滚,这不是我最关心的问题。这将在下次登录时修复,但我不希望此异常触发异常时生成的电子邮件。发生的情况是,您的一个嵌套方法调用引发未检查的异常,这将导致事务标记为仅回滚。然后,在调用过程中,代码捕捉到异常。但事务已标记为仅回滚,您会看到此意外回滚异常错误。您可以确保,未经检查的异常不会跨越事务性方法,并且在此之前捕获它。。否则,要么让原始异常一直向上传播。。我现在对这个案子非常清楚,但是我无法理解把这个问题一直传播下去的原因,请你再详细一点好吗。非常感谢。@SudhirN,这个异常只在保存或更新时发生,还是在读取操作时发生?这里的这个场景(下面提到的链接)也有点类似于您之前解决的场景。我试着用你的帖子帮助另一个苦苦挣扎的寻求解决方案的人,因为它几乎是一样的&经过了尝试和测试。