繁体   English   中英

如何知道grails服务中的事务方法是否成功?

[英]How to know if a transactional method in a grails service was successful?

我有这样的事情:

class SomeService {
   static transactional = true

    def someMethod(){
      ...
      a.save()
      ....
      b.save()
      ....
      c.save()
      ....
      etc...
}

}

我想知道事务方法是否成功,我不想检查每个域对象中的error属性,因为逻辑涉及许多域类,而且这很困难。

采用

a.save(failOnError: true) 
b.save(failOnError: true)
c.save(failOnError: true) 
d.save(failOnError: true)

我假设您想要的服务是在单个域保存错误时引发异常,并在这种情况下回滚事务。

您可以通过多种方式进行检查:-

  1. 由于您不想跟踪服务类中的所有saves ,因此我想您也不想跟踪每个保存都设置failOnError标志的情况。 另一种方法是在Config.groovy设置grails.gorm.failOnError=true ,如果对域类的验证失败,它将自动检查每个保存并抛出ValidationException ValidationException是一个RuntimeException因此如果抛出一个事务,该事务将被回滚。 看一下failOnError可以得到这个主意。

  2. (在您的情况下,稍为冗长)Save方法在成功的情况下返回域对象本身,在验证失败时返回null。 再次,您将跟踪所有saves以检查类似if(a.save()){...}if(b.save()){...} ,等等等等。

  3. (我认为适当的方法)将使用TransactionAspectSupport来获取事务状态并检查它是否设置为仅回滚。 如果不是,那你就很好。

例如:

def someMethod(){
   try{
      ...
      a.save()
      ....
      b.save()
      ....
      c.save()
      ....
      etc...
   }catch(e){
      //It can also be used as a last line in method instead of checking
      //in catch block.
      println TransactionAspectSupport.currentTransactionStatus().isRollbackOnly() 
   }

   //println TransactionAspectSupport.currentTransactionStatus().isRollbackOnly() 

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM