2011-02-24 68 views
0

在我的Person控制器Delete操作中,我期望如果DataIntegrityViolationException發生,那麼關聯的Authority記錄將被恢復,但它們不是。無論如何,我甚至不需要做明確的回滾,但是不管有沒有,回滾都不會發生。看來withTransaction回滾不起作用。或者我做錯了什麼?我使用Grails 1.3.7和MySQL(innodb)。withTransaction不能正確回滾

 Person.withTransaction { status -> 
      Authority.findAll().each { it.removeFromPeople(person) } 
      try { 
       person.delete() 
       flash.message = "person.deleted" 
       flash.args = [params.id] 
       flash.defaultMessage = "User ${params.id} deleted" 
       redirect(action: "list") 
      } 
      catch (org.springframework.dao.DataIntegrityViolationException e) { 
       status.setRollbackOnly() 
       flash.message = "person.not.deleted" 
       flash.args = [params.id] 
       flash.defaultMessage = "User ${params.id} could not be deleted" 
       redirect(action: "show", id: params.id) 
      } 
     } 

UPDATE

我意識到,我的一些表格,其中不會InnoDB的。我糾正了這個問題,起初看起來問題解決了。我可以嘗試刪除用戶記錄,獲取錯誤,然後以該用戶身份登錄。之前,登錄失敗並出現此錯誤,這意味着權限記錄尚未回滾。

ERROR springsecurity.GrailsDaoImpl - User [admin9] has no GrantedAuthority 

所以一切看起來不錯。然後我重新啓動我的應用程序,嘗試登錄並再次出現錯誤。所以即使回滾看起來有效,那些永遠不會保留到數據庫的記錄。

+0

事實證明,並不是我所有的表中innodb。管理局最終成爲ISAM。不知道這是怎麼發生的。 – 2011-02-24 19:44:29

回答

0

難道你是從另一個事務執行這段代碼嗎?也許,從服務方法來看,默認情況下是事務性的?

MySQL不支持嵌套事務。