2017-08-23 31 views
1

在控制器方法中有以下代碼塊。withTransaction並保存很多對象?

def stat = '' 

    stat = assignBibNumbers(compositeEvent.id) 

這裏是被稱爲在上面的代碼的私有函數:請注意,只有相關的部分顯示

private def assignBibNumbers(Long id){ 

    ... 

    def eventRange = bibsService.convertRangeStringToRangeList(compositeEvent.bibsRange) 


    for(int j=0; j<finRegsList.size(); j++){ 

     finRegsList[j].raceParticipant.bibNumber = eventRange[j] 
     finRegsList[j].save() 


    } 


     return "Bib Setup Complete! No bib assignment was made." 




} 

保存不工作在上述情況下。沒有分配號碼。現在

,如果我的代碼的上述第一部分變爲

def stat = '' 
RaceRegistration.withTransaction { status -> 
    stat = assignBibNumbers(compositeEvent.id) 
} 

它的作品!所以我非常困惑,爲什麼我應該在withTransaction塊中包裝函數。我甚至認爲即使沒有包裹在交易區塊中,保存仍然應該起作用。什麼導致save()在沒有事務塊的情況下無法工作?應該保存在一個循環中總是被封裝在一個事務塊中?我感謝任何幫助!謝謝!

回答

0

我以爲即使沒有包裹在事務塊保存仍應該工作。

這對於Service方法是正確的。對於Service方法隱式開始交易,而不是針對Controller方法。

欲瞭解更多insight,但不完全相關。