【发布时间】:2011-02-24 18:43:18
【问题描述】:
在我的 Person 控制器 Delete 操作中,我希望如果发生 DataIntegrityViolationException,那么相关的授权记录将被恢复,但事实并非如此。无论如何,我真的什至不需要进行显式回滚,但是无论有没有它,回滚都不会发生。看来 withTransaction 回滚不起作用。还是我做错了什么?我正在使用 Grails 1.3.7 和 MySQL (innodb)。
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)
}
}
更新
我意识到我的一些表不是 innodb。我纠正了这一点,起初看起来问题已经解决了。我可以尝试删除用户记录,获取错误,然后以该用户身份登录。之前登录失败,出现这个错误,说明权限记录没有回滚。
ERROR springsecurity.GrailsDaoImpl - User [admin9] has no GrantedAuthority
所以一切看起来都很好。然后我重新启动了我的应用程序,尝试登录并再次收到错误。因此,即使回滚似乎有效,但从未持久化到数据库中的记录。
【问题讨论】:
-
原来我的所有表都不是 innodb.权威最终成为 ISAM。不知道这是怎么发生的。
标签: mysql grails transactions spring-transactions