2014-04-16 18 views
0

如果我在使用GORM的同一線程上執行兩次刷新,是否有可能在第一次通過而第二次在單獨事務中失敗?在同一個線程上執行兩次刷新GORM

或即使我只有一個通過線程中途刷新一半,然後在請求結束後第二次隱式刷新,是否有可能第二次失敗,但是顯式刷新的更改可以通過並因此被持續在數據庫中?

感謝

回答

1

如果我有使用GORM在同一個線程兩次沖洗,有可能是第一個通過第二要在不同的交易失敗?

這是交易成功/失敗,而不是沖刷。在每個事務結束時以及每個會話結束時(請求)都有一個隱式刷新。在同一個線程中有幾個事務是絕對可能的,其中一些事務失敗,其中一些成功。例如,給定一個簡單的域類

class Book { 
    String title 
} 

someAction的第一筆交易將成功,第二次將被回滾。

class MyController { 

    def someAction() { 

    Book.withTransaction { 
     new Book().save(title: 'successful').save(failOnError: true) 
    } 

    Book.withTransaction { 
     new Book().save(title: 'failed').save(failOnError: true) 
     throw new RuntimeException('transaction rollback') 
    } 
    } 
} 
+0

因此,如果我不使用withTransaction而是多次調用flush,這一切仍然定義爲一個原子事務嗎? –

+0

如果你沒有把你的代碼放在'withTransaction'或一個服務方法(默認是事務性的)中,你沒有*任何* transactions –

+1

正如唐提到的,如果你沒有指定事務邊界(通過'withTransaction或服務上的@ Transactional轉換),那麼你的數據庫連接處於自動提交模式,並且由於沒有事務存在,刷新將自動保存任何更改。 –

相關問題