在我的Person控制器删除操作中,我希望如果发生DataIntegrityViolationException,则会恢复关联的Authority记录,但它们不会。我甚至不需要进行显式回滚,但无论有没有,回滚都不会发生。似乎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
所以一切都很好看。然后我重新启动了我的应用程序,尝试登录并再次收到错误。因此,即使回滚似乎有效,记录也永远不会持久存储到数据库中。
答案 0 :(得分:0)
您是否正在从另一个交易中执行此代码?也许,从服务方法来看,默认是事务性的?
MySQL不支持嵌套事务。