【发布时间】:2014-10-21 06:26:18
【问题描述】:
控制器逻辑:
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% 的案例,但不是全部。
【问题讨论】:
-
如果你把这个逻辑移到一个服务方法中,这样在同一个事务下完成,你会不会更好?
-
我不想让服务超载。你觉得有道理吗?
-
最好将业务逻辑转移到服务中并使您的控制器尽可能地精简(我所说的精简是指代码行数更少)。这将帮助您在需要时重用代码,并节省大量测试时间。
-
您是否期望许多用户对此操作并发请求,或者只有一个用户多次点击该操作?
-
@NikhilBhandari 目前只是我自己测试。根本没有并发用户(都在本地主机上)
标签: hibernate grails grails-orm staleobjectstate