Spring 控制器中的Grails UnexpectedRollbackException

Spring 控制器中的Grails UnexpectedRollbackException,spring,grails,transactions,spring-transactions,Spring,Grails,Transactions,Spring Transactions,我的Grails服务调用一个插件,该插件引发运行时异常。在我的情况下,我不关心异常,所以它被吞没了 MyGrailsService { def myMethod { ... try { //callPlugin } catch (Exception ex) { ... } } } 一切正常,捕获异常并继续处理。然而,在我的控制器中,我有一个catch(T

我的Grails服务调用一个插件,该插件引发运行时异常。在我的情况下,我不关心异常,所以它被吞没了

MyGrailsService {
    def myMethod {
         ...
         try {
             //callPlugin
         } catch (Exception ex) {
              ...
         }
    }
}
一切正常,捕获异常并继续处理。然而,在我的控制器中,我有一个
catch(Throwable t)
块,我不希望执行它,因为异常被吞没了。结果是执行了
catch(Throwable t)
块,因为Grails抛出了一个
org.springframework.transaction.UnexpectedRollbackException
我当然不希望它这样做。我想我得到这个是因为插件抛出的异常是运行时,所以Grails回滚事务

我不希望抛出此
意外回滚异常


有什么建议吗?

我会做的是

class MyService{

  static transactional = false

  def myMethod {
         ...
         try {
             //callPlugin
         } catch (Exception ex) {
              ...
         }
    }

  @Transactional(readOnly = true)
  def someMethod {
    // Some code here  
  }


}
上面的代码将使服务中的所有方法都成为非事务性的,并且我们将显式地使我们想要的方法成为事务性的


然而,还有一点需要注意,就是你正在调用的插件的方法,该方法本身可以是一个事务性方法,一旦出错,它可能会回滚并抛出一个意外的回滚异常。因此,如果插件方法是事务性的,您必须检查它一次。

我遇到了类似的情况,对此也感到困惑。在我的例子中,这是一个干净实用的解决方案,通过在调用函数之前检查数据来避免首先抛出异常。但很明显,在很多情况下,这是不可能或不可取的。