在我的 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
所以一切看起来都很好。然后我重新启动了我的应用程序,尝试登录并再次收到错误。因此,即使回滚似乎有效,但从未持久化到数据库中的记录。