在“我的个人控制器删除操作”中,我希望如果发生了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)
}
}更新
我意识到我的一些桌子不是无害的。我纠正了这一点,起初看来问题已经解决了。我可以尝试删除用户记录,获取错误,然后以该用户身份登录。在此之前,此错误导致登录失败,这意味着当局的记录没有回滚。
ERROR springsecurity.GrailsDaoImpl - User [admin9] has no GrantedAuthority所以一切看起来都很好。然后我重新启动我的应用程序,尝试登录并再次获得错误。因此,即使回滚看起来很有效,但从未保存到数据库的记录也是有效的。
发布于 2011-02-25 09:37:18
会不会是您从另一个事务中执行此代码?也许,从服务方法来看,这在默认情况下是事务性的?
MySQL不支持嵌套事务。
https://stackoverflow.com/questions/5109014
复制相似问题