有關Grails的事務

1. Grails2.4自動生成的Controller會爲類加上只讀事務的註解,如下:

@Transactional(readOnly = true)

class Domain1Controller {
...

這會導致連接事務型數據庫(如MySQL)進行讀寫操作的方法必須顯示的加上開啓讀寫事務(缺省爲讀寫)的聲明,否則會報異常:Connection is read-only. Queries leading to data modification are not allowed

@Transactional
def save(Domain1 domain1Instance) {
...

給類加事務聲明會強制新增的每個方法使用事務,不想使用事務只能把類聲明處的@Transactional註解刪除。


2. Grails2.4自動生成的Service也加了事務聲明,但缺省是讀寫的,如下:

@Transactional
class Domain1Service {
...

3. Grails2.4的Service中有兩個方法save1和save2,save1中調用了save2。如果save1聲明爲只讀事務,即使save2聲明爲讀寫事務,也會導致異常:Connection is read-only. Queries leading to data modification are not allowed。

同樣的,controller中某聲明爲只讀事務的方法,調用聲明爲讀寫事務的service1.save2,也會導致只讀連接不允許寫的異常。

這說明事務狀態以最初的入口函數爲準。


4. 都知道的如果需要回滾,必須人工拋出RuntimeException,而不是其他類型的異常。


5. 事務內發生的任何數據庫操作,即使調用了flush:true,也不會立即寫入數據庫。只有當事務被提交的時候(並且flush?)纔會被寫入數據庫。


6. 待續




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章