我有一个脚手架的域类,我试图让它抛出一个乐观的锁定异常,但它不会。我在两个不同的浏览器中将相同的实例放在编辑模式中。我在浏览器1中编辑一个字段,然后单击更新。我确认版本递增。然后我在浏览器2中编辑并单击更新。它只是在浏览器2更改时覆盖浏览器1的更改。我在这里看到很多关于人们在不想要的情况下获得异常的问题,所以我想知道他们是否会以某种方式在Hibernate中将其关闭。我甚至尝试更改更新方法,所以它只是执行instance.save()。我不明白乐观锁定应该做什么?
package demo
class issue {
String synopsis
String details
static constraints = {
synopsis()
details(size: 0..1000)
}
}
答案 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会按原样存储实例,而不检查版本