我得到了这样的代码:
def myObject = MyDomainClass.get(myId)
myObject.refresh()
myObject.myProperty = myValue
myObject.save(flush:true, failOnError:true)
尽管有get和刷新,我有时会得到一个“org.hibernate.StaleObjectStateException:当执行保存时,行被另一个事务更新或删除(或未保存的值映射不正确)”。
当我开始在多个会话中同时执行此方法时,会发生这种情况。但是,事务1 肯定完成,此代码再次针对事务2执行,仍然失败! (我使用事务服务在因乐观锁定而失败时重新执行事务,请参阅here)。
虽然我从DB获得了一个“新鲜”的版本,但是怎么可能呢?
答案 0 :(得分:1)
This forum thread暗示您可能需要另一个Hibernate会话。如果您为新交易尝试新会话,例如
,该怎么办?Book.withNewSession{}
答案 1 :(得分:1)
我至少找到了一种解决方法 - 回滚空交易:
myDomain.withTransaction { status ->
status.setRollbackOnly()
}
答案 2 :(得分:0)
你应该使用
MyDomainClass.lock(myId)
而不是
MyDomainClass.get(myId)