2017-07-19 135 views
1

在我的grails应用程序中,我经常得到org.springframework.transaction.HeuristicCompletionException:启发式完成:结果状态回滚;嵌套异常是org.springframework.transaction.UnexpectedRollbackException:事务已回滚,因为它已标记为只回滚。我以某种方式发现,如果在由@Transactional注释的方法内发生任何类型的异常,并在具有其自己的@Transactional的方法内部调用,则会发生这种情况。我的查询是否可以简单地捕获并忽略此异常?Grails中的HeuristicCompletionException可以忽略吗?

+0

这是什么意思是事务回滚没有从你身边做。 –

+0

我随机得到这个问题,任何暂时的问题都可能导致事务回滚,这不是我主要关心的问题。这将在下次登录时修复,但我不希望此异常触发异常时生成的电子邮件。 –

+0

发生什么事是,您的嵌套方法调用之一引发未经检查的异常,这是导致事务被标记为仅回滚。然后在哪里调用你的代码捕获异常。但事务已标记为仅回滚,并且您看到此UnexpectedRollbackException错误。您可以确保,未经检查的异常不会跨越事务性方法,并在此之前捕获它。否则,或者让原始异常一直传播起来..否则只是忽略这个UnexpectedRollbackException –

回答

1

对此我有一个解决方法,正如Sudhir在评论中所建议的,我可以在其中一个方法中复制启发式完成问题,并发现为了不回滚服务使用的现有事务,我们为每个方法创建新的事务为:

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

注释@Transactional(传播= PROPAGATION.REQUIRES_NEW)这将创建一个新的事务处理的方法和暂停现有的事务。由于这会在每次执行方法时创建新的事务,这肯定会对大型多线程应用程序造成性能问题,所以我通过处理服务类中每个方法中的所有可能的异常来缓解这种情况。这会更好。