控制器逻辑:
def updateObject() { Object o = Object.get(params.id as Long) o.otherObjects.clear() objectDataService.saveObject(o.id) OtherObject newObject = new OtherObject; o.addToOtherObjects(newObject) objectDataService.saveObject(o.id) }
服务逻辑
def saveObject(long profileId) { o.save(flush:true) }
怎么了
在90%的情况下,这将正常工作。
问题
ERROR errors.GrailsExceptionResolver - StaleObjectStateException occurred when processing request: [GET] /controller/updateObject - parameters: stuff[]: data Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [com.path.Object#1]. Stacktrace follows: Message: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [com.path.Object#1]
我已经阅读了相关问题,并找到了merge上面看到的电话。它解决了大约50%的案件,但不是全部。
merge
对于我们来说,一些不同的方法最终解决了StaleObjectException定期发生的问题:
object = object.refresh()
检索对象后刷新对象解决了我们的大多数StaleObjectExceptions。尤其是在某人可能会从其他地方处理同一对象并更改其某些成员的情况下(大多数问题来自集合成员)。
总体项目稳定性:
wrongly linked resources
我们在实际上不需要的特定资源文件上有一个404,因此在一段时间内忽略了它。原来,丢失的文件将导致会话保持打开状态-从而左右构造了StaleObjects。
因此,作为向 比平常多的 人的提示(某些StaleObject可能经常发生-请参见上面的答案)StaleObjectExceptions:确保 所有 资源都正确链接,并且您的开发人员工具(Chrome F12)不会报告任何丢失的文件。