Grails 2.3.6没有抛出乐观的例外

时间:2014-03-03 03:12:57

标签: grails

我有一个脚手架的域类,我试图让它抛出一个乐观的锁定异常,但它不会。我在两个不同的浏览器中将相同的实例放在编辑模式中。我在浏览器1中编辑一个字段,然后单击更新。我确认版本递增。然后我在浏览器2中编辑并单击更新。它只是在浏览器2更改时覆盖浏览器1的更改。我在这里看到很多关于人们在不想要的情况下获得异常的问题,所以我想知道他们是否会以某种方式在Hibernate中将其关闭。我甚至尝试更改更新方法,所以它只是执行instance.save()。我不明白乐观锁定应该做什么?

package demo
class issue {
    String synopsis
    String details

    static constraints = {
        synopsis()
        details(size: 0..1000)
    }
}

1 个答案:

答案 0 :(得分:0)

我没有尝试过Grails 2.3.x,但是在2.2.4版本中,版本检查恰好发生在update动作中而不是深入hibernate:

def update(Long id, Long version) {
    def priceInstance = Price.get(id)
    //..
    if (version != null) {
        if (priceInstance.version > version) {
            priceInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                      [message(code: 'price.label', default: 'Price')] as Object[],
                      "Another user has updated this Price while you were editing")
            render(view: "edit", model: [priceInstance: priceInstance])
            return
        }
    }

    priceInstance.properties = params

    if (!priceInstance.save(flush: true)) {
        render(view: "edit", model: [priceInstance: priceInstance])
        return
    }
    ...
  }

如果您不使用该代码或类似代码,GORM会按原样存储实例,而不检查版本