乐观锁定问题-rejectValue 不起作用,无论如何都保存了坏域

Posted

技术标签:

【中文标题】乐观锁定问题-rejectValue 不起作用,无论如何都保存了坏域【英文标题】:optimistic locking issue - rejectValue not working, bad domain being saved anyway 【发布时间】:2014-08-16 06:52:22 【问题描述】:

我看到其他人也遇到过这个问题,但我还没有找到适合我的解决方案。在我的域控制器的更新方法中,我试图通过检查版本和使用拒绝值()来实现乐观锁定;但是,我显然做错了什么。我已验证正在调用 rejectValue(),但它似乎不起作用。

此外,具有错误数据的域实例无论如何都会保存。任何建议或帮助表示赞赏。这是我有问题的更新方法:

def update(Cohort cohortInstance) 
    if (cohortInstance == null) 
        notFound()
        return
    

    cohortInstance = Cohort.get(params.id)
    if (cohortInstance == null) 
        notFound()
        return
    

   if (params.version) 
        def version = params.version.toLong()
        if (cohortInstance.version > version) 
            cohortInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                      [message(code: 'cohort.label', default: 'Cohort')] as Object[],
                      "Another user has updated this Cohort while you were editing")
            render(view: "edit", model: [cohortInstance: cohortInstance])
            return
        
    

    // Bind browser data to this cohort Instance now that we've passed the concurrency check
    cohortInstance.properties = params

    if (cohortInstance.hasErrors()) 
        respond cohortInstance.errors, view:'edit'
        return
    

    cohortInstance.save flush:true

    request.withFormat 
        form multipartForm 
            flash.message = message(code: 'default.updated.message', args: [message(code: 'Cohort.label', default: 'Cohort'), cohortInstance.proposedCode])
            redirect cohortInstance
        
        '*' respond cohortInstance, [status: OK] 
    

【问题讨论】:

【参考方案1】:

在您的 update 方法定义 (def update(Cohort cohortInstance) ) 中,您正在初始化 Cohort 的实例,这是 grails 2.3.x 中的一个新功能,grails 会在其中自动初始化实例&为你做参数绑定。

然后在第 4 行,您将使用 Cohort.get(params.id) 获取 Cohort 实例。所以现在你有两个选择:第一个是,你可以使用 read 方法而不是 get 并从动作签名中删除自动初始化,或者第二个是,你可以删除此行 (cohortInstance = Cohort.get(params.id)) 并在更新操作中添加 Transactional 注释,例如:

import grails.transaction.Transactional

@Transactional(readOnly = true)
def update(Cohort cohortInstance) 
  ...

任何这些工作。

【讨论】:

以上是关于乐观锁定问题-rejectValue 不起作用,无论如何都保存了坏域的主要内容,如果未能解决你的问题,请参考以下文章

JPA 在带有 DTO 和乐观锁定的 RESTful Web 应用程序中合并?

设备锁定时警报不起作用

CoreData:错误:无法解决乐观锁定失败:乐观锁定失败(null),只有旧记录,为啥?

乐观与悲观锁定

Spring data - 启用乐观锁定

使用 MPNowPlayingInfoCenter 显示锁定屏幕图像不起作用