2010-07-29 86 views
6

我想在功能級別實現事務控制。我想要的是這樣的。執行聲明性事務的問題

類爲MyService {

靜態事務=假

@Transactional(唯讀= FALSE, 傳播= Propagation.REQUIRES_NEW)

公共DEF saveCountry(){國家CO = 新國家(name:'mycountry') co.save()createState()

}

@Transactional(唯讀= FALSE, 傳播= Propagation.REQUIRES_NEW)

公共DEF createState(){ 狀態狀態=新的國家(名稱: '州') state.save()拋出新的RuntimeException() }}

什麼,我想要的是createState()創建一個新的事務無關的saveCountry(),這樣如果createState()失敗的,

已保存的國家對象未被撤銷。雖然我已經給出了註釋,但他們沒有產生預期的效果。這裏創建了單個事務 ,並且在拋出異常時將其撤銷。未保存該對象。

任何人都可以幫忙

+0

它看起來像一個Grails錯誤。在這裏提交JIRA問題:http://jira.codehaus.org/browse/GRAILS – fabien7474 2010-07-29 07:13:37

+0

我有同樣的問題 - 這裏是解決方案: http://grails.1312388.n4.nabble.com/Declarative-transactions- DON-T-作品 - 在-1-3-X-tp2308918p2309028.html – Oleksandr 2010-07-31 18:56:09

回答

1

我不會推薦採取這種方法。當您到達createState()方法時,如果沒有可用的事件,那麼grails會在創建新事務之前嘗試使用任何打開的事務。

相反,我只想用周圍只有所需的Grails的代碼,而不是試圖申報事務

http://www.grails.org/doc/1.3.x/ref/Domain%20Classes/withTransaction.html

的方法,例如,我可以有一個塊的任何地方,如小事務塊

State.withTransaction { status -> 
    //all the code in here has an explicit transaction 
} 

此事務在刷新結束時刷新或回退,並且事務對Spring對象TransactionStatus有一個引用。這爲錯誤處理提供了良好的紋理控制。這將允許您擁有較大的交易塊,但仍決定交易何時何地結束。

我想更改代碼以

public def saveCountry() { 
    Country.withTransaction { status -> 
     Country co = new Country(name:'mycountry') 
     co.save() 
    } 
    createState() 
} 

public def createState(){ 
    State.withTransaction { status -> 
     State state = new State(name:'state') 
     state.save() 
     throw new Exception 
    } 
} 

在這種情況下,該國將被保存,但該州的事務將被回滾