2014-07-03 53 views
0

GGTS 3.4 Grails 2.3.3 - 當生成控制器時,這個版本包含了許多@Transactional行,我從未見過,但我不完全明白他們在做什麼。Grails - 回滾管理數據庫事務

在控制器的頂部有一行:

@Transactional(readOnly = true) 

然後之前一定分貝變化的行動:「保存」,「更新」和「刪除」有行:

@Transactional 

我認爲這會將每次dB改變操作的readOnly切換爲false。它是否會打開一個可以提交或回滾的新事務?有沒有簡單的方法來強制回滾?

儘管執行'new'db命令來創建特定域類的新實例,但「創建」操作在它之前沒有@Transactional行。如果保存事務沒有完成或者是否回滾,那麼這個新創建但未保存的實例會發生什麼?通過未完成,我正在考慮在'創建'視圖中引入'取消'按鈕,以便用戶可以根據需要從創建中退出 - 用戶也可以在不調用保存的情況下輕鬆導出創建視圖。

-Mike

回答

0

標準@Transactional而不設置任何屬性使用平臺默認值。這些取決於您的交易管理器和您的數據源。但是,它確實創建了一個可以進行交易或回滾的交易。

沒有任何註釋的Conroller方法不參與任何事務(假設整個類沒有註釋)。

create的情況下,不需要事務,因爲您沒有與數據庫/事務管理器進行交互。簡單地創建一個域類的新實例,例如new MyDomainClass()根本不與數據庫交互,這就是您在create方法中看到的內容。

簡而言之,如果用戶離開頁面或單擊取消,則不需要擔心該實例。

+0

我在此階段使用H2休眠 - 我注意到,當我嘗試在取消或退出某個視圖後列出視圖中的所有實例時,我會看到一些臨時實例顯示爲「未保存」創建。當談到做回滾時,我已經閱讀了關於在服務中使用setRollbackOnly()的問題。這是做回滾的唯一方法。另外,如果我在保存的情況下執行此操作,它會清理未保存的實例嗎? – mikek

0

您可以使用域的「withTransaction」的方法來手動管理事務如下:

Account.withTransaction {狀態 - >

嘗試{ 編寫代碼或業務邏輯在這裏 }趕上(例外五){

status.setRollbackOnly() 

} }

如果生成異常,則此事務將回滾