【问题标题】:Grails UnexpectedRollbackException in Controller控制器中的 Grails UnexpectedRollbackException
【发布时间】:2014-11-28 18:10:18
【问题描述】:

我的 Grails 服务调用了一个引发运行时异常的插件。就我而言,我不关心异常,所以它被吞下了。

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

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

我不希望这个 UnexpectedRollbackException 被抛出。

有什么建议吗?

【问题讨论】:

  • 我也遇到过类似的情况,也同样疑惑。就我而言,这是一个干净而实用的解决方案,通过在调用函数之前检查数据来避免首先引发异常。但显然在很多情况下这是不可能或不可取的。

标签: spring grails transactions spring-transactions


【解决方案1】:

我会做的是

class MyService{

  static transactional = false

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

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


}

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多