withTransaction不能正确回滚

时间:2011-02-24 18:43:18

标签: mysql grails transactions spring-transactions

在我的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

所以一切都很好看。然后我重新启动了我的应用程序,尝试登录并再次收到错误。因此,即使回滚似乎有效,记录也永远不会持久存储到数据库中。

1 个答案:

答案 0 :(得分:0)

您是否正在从另一个交易中执行此代码?也许,从服务方法来看,默认是事务性的?

MySQL不支持嵌套事务。