0

我有一种情况,一个线程可以从数据库中检索一个对象,并对其进行编辑,当刷新它时,我得到一个StaleObjectStateException,因为与此同时另一个线程已经编辑了同一个对象(我使用乐观锁定)。我可以明白为什么会这样,但我无法改变这种行为。

所以我尝试做的是再次从数据库中检索对象并在最新版本上重新应用更改,但是在我什至更改任何内容之前进行检索后,我就会得到另一个StaleObjectStateException,这是为什么呢?

try{
    songs = nextSongGroup.getSongs(session);
    modifySongs(songs);
    session.flush();
}
catch(StaleObjectStateException sobe){
     songs = nextSongGroup.getSongs(session);
     modifySongs(songs);
}
4

1 回答 1

1

如果你得到这个例外,那就太晚了。您需要丢弃会话并获得一个新会话。同一会话上的任何查询都将导致相同的异常。

理论上调用 em.clear(); 并重新运行相同的查询可能会有所帮助。我从来没有试过这个。

对我来说,我通常会向用户展示一个糟糕的页面,该页面有一个重试按钮,可以在干净的会话中再次运行他的请求。

于 2012-06-21T11:35:23.913 回答