【问题标题】:withTransaction Doesn't Do Rollbacks CorrectlywithTransaction 不能正确回滚
【发布时间】:2011-02-24 18:43:18
【问题描述】:

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

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

【问题讨论】:

  • 原来我的所有表都不是 innodb.权威最终成为 ISAM。不知道这是怎么发生的。

标签: mysql grails transactions spring-transactions


【解决方案1】:

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

MySQL 不支持嵌套事务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2016-09-03
    相关资源
    最近更新 更多