我有一种情况,一个线程可以从db中检索一个对象,并对其进行编辑,当刷新它时,我得到一个 StaleObjectStateException ,因为在此期间另一个线程编辑了同一个对象(我正在使用乐观锁定)。我可以看出它为什么会发生,但我无法改变这种行为。
所以我尝试做的是再次从数据库中检索对象并在最新版本上重新应用更改,但在我甚至更改之前,只要我进行检索就会得到另一个 StaleObjectStateException什么,这是为什么?
try{
songs = nextSongGroup.getSongs(session);
modifySongs(songs);
session.flush();
}
catch(StaleObjectStateException sobe){
songs = nextSongGroup.getSongs(session);
modifySongs(songs);
}
答案 0 :(得分:1)
如果你有这个例外,已经太晚了。你需要扔掉会话并获得一个新会话。对同一会话的任何查询都会导致相同的异常。
理论上调用em.clear();并重新运行相同的查询可能会有所帮助。我从来没有试过这个。
对我来说,我通常会向用户显示一个Oops页面,该页面有一个重试按钮,可以在干净的会话中再次运行他的请求。