在grails中,为什么我在刷新后直接获得StaleObjectStateException?

时间:2010-12-08 09:44:08

标签: hibernate exception data-binding grails staleobjectstate

我得到了这样的代码:

def myObject = MyDomainClass.get(myId)
myObject.refresh()
myObject.myProperty = myValue
myObject.save(flush:true, failOnError:true)

尽管有get和刷新,我有时会得到一个“org.hibernate.StaleObjectStateException:当执行保存时,行被另一个事务更新或删除(或未保存的值映射不正确)”。

当我开始在多个会话中同时执行此方法时,会发生这种情况。但是,事务1 肯定完成,此代码再次针对事务2执行,仍然失败! (我使用事务服务在因乐观锁定而失败时重新执行事务,请参阅here)。

虽然我从DB获得了一个“新鲜”的版本,但是怎么可能呢?

3 个答案:

答案 0 :(得分:1)

This forum thread暗示您可能需要另一个Hibernate会话。如果您为新交易尝试新会话,例如

,该怎么办?
Book.withNewSession{}

答案 1 :(得分:1)

我至少找到了一种解决方法 - 回滚空交易:

myDomain.withTransaction { status -> 
  status.setRollbackOnly()
}

答案 2 :(得分:0)

你应该使用

MyDomainClass.lock(myId)

而不是

MyDomainClass.get(myId)