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

时间:2013-06-28 04:23:16

标签: grails gorm grails-services

我有这样的事情:

class SomeService {
   static transactional = true

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

}

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

2 个答案:

答案 0 :(得分:3)

使用

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

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

答案 1 :(得分:2)

您可以通过多种方式查看相同内容: -

  1. 由于您不想跟踪服务类中的所有saves,我猜您也不想跟踪每个保存以设置failOnError标志。替代方法是在grails.gorm.failOnError=true中设置Config.groovy,它会自动检查每个保存并在域类验证失败的情况下抛出ValidationExceptionValidationExceptionRuntimeException因此,如果抛出一个事务,将回滚事务。看看failOnError就可以了解这个想法。

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

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

  4. 例如:

    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() 
    
    }