0

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

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

4

1 回答 1

0

可能是您正在从另一个事务中执行此代码吗?也许,从服务方法来看,默认情况下是事务性的?

MySQL 不支持嵌套事务。

于 2011-02-25T09:37:18.423 回答