2013-06-28 86 views
1

我有這樣的事情:如何知道grails服務中的交易方法是否成功?

class SomeService { 
    static transactional = true 

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

}

我想知道,如果交易方法是成功還是失敗,我不想來檢查錯誤屬性中的每個域對象,因爲邏輯涉及許多領域類,這將是困難的。

+0

如果交易成功,換句話說,如果一個回滾被執行或者不是我的意思與「交易法成功」是。 – luisZavaleta

+0

查看答案結尾處的示例。 :) – dmahapatro

+0

答案有幫助嗎? – dmahapatro

回答

3

使用

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

我假設你想要的是扔在一個域中的錯誤異常保存,在這種情況下回滾事務服務。

+0

這項工作,謝謝我只需要檢查方法是否拋出異常,我知道事務是否成功執行。 (順便說一句,我只是想知道,如果交易成功,只是告訴用戶發生了什麼事情(發送錯誤信息)) – luisZavaleta

2

有許多方式可以檢查相同的: -

  1. 如您不想跟蹤所有的saves服務類,我想你也不會喜歡跟蹤每個保存也設置failOnError標誌。另一種方法是在Config.groovy中設置grails.gorm.failOnError=true,它會自動檢查每個保存並在域類驗證失敗時拋出ValidationExceptionValidationExceptionRuntimeException因此如果拋出一個事務將被回滾。看看failOnError來獲得這個想法。

  2. (在你的情況下稍不詳細)保存方法在成功的情況下返回域對象本身,否則返回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() 

} 
+0

我正在尋找這樣的東西,但我會使用@JavaDev解決方案,因爲這樣我可以知道導致回滾的錯誤。 – luisZavaleta

+1

@LxZv該解決方案也以優化方式作爲第1點提及。 – dmahapatro