Controller中的Grails UnexpectedRollbackException

时间:2014-10-03 16:39:00

标签: spring grails transactions spring-transactions

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

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

一切正常,异常被捕获并继续处理。但是,在我的Controller中,我有一个catch (Throwable t)块,我不希望它被执行,因为吞下了异常。事实证明catch (Throwable t)块已执行,因为Grails会抛出一个org.springframework.transaction.UnexpectedRollbackException 当然我不希望它这样做。我想我得到了这个,因为插件抛出的异常是运行时,所以Grails回滚事务。

我不希望抛出此UnexpectedRollbackException

任何提示?

1 个答案:

答案 0 :(得分:0)

我会做的是

class MyService{

  static transactional = false

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

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


}

上面的代码将使服务中的所有方法都是非事务性的,我们将明确地使方法成为我们想要的事务。

然而,再一件事可能是要处理的一点,你正在调用的插件的方法,该方法本身可以是一个事务方法,它可能会被回滚并抛出一个UnexpectedRollbackException。因此,如果插件方法是事务性的,则必须检查一次。