StaleObjectException,但真的很奇怪

时间:2013-03-14 06:57:28

标签: hibernate staleobjectstate

我继承了一个app,它执行一些基于触发器的插入和更新,偶尔会抛出StaleObjectException。我试着添加了很多调试(tx,hibernate,type等),这让我更加困惑。

15:21:00 Calling dao.insert
15:21:00 starting Trancation T1 
15:21:01 insert records including object #290595
15:21:01 Transaction T1 commits

我在日志中看到了tx提交,hibernate插入和数据,实际上id为#290595的对象被绑定为值。在15:24:00有一个类似的插入,但直到15:25:00,应用程序完全无声(没有用户,没有其他活动)。

15:25:00 Start a Required_new transaction T2
15:25:00 Calling dao.finder
15:25:01 dao transaction uses propagated T2
15:25:01 Select returns object with id #290595
15:25:01 ends propagated transacted finder
15:25:02 calling dao.update
15:25:02 dao transaction uses propagated T2
15:25:02 binds object with id #290595
15:25:02 Could Not Synchronize Database State With Session (StaleObjectStateException)

数据库中的SQL查询显示记录#290595确实不存在。插入和故障之间有4分钟。毋庸置疑,这通常是大部分时间都有效,但突然间......

不会在事务提交时自动刷新和提交休眠吗?

我假设插入已将数据移动到缓存而不是DB,再次在缓存中找到,但拒绝更新,因为它们不在DB中。所以问题是,如果有人有任何好主意吗?

这是一个oracle DB,我试图确保T2有Required_new事务,并且使用isolation_level序列化,但效果不大..我开始认为插入是以某种方式未被注释,?!

欢迎任何建议

1 个答案:

答案 0 :(得分:0)

我自己找到了答案。

我偶然发现StaleObjectStateException in Hibernate ver 2的javadoc:

Thrown when a version number or timestamp check failed, indicating that the Session 
contained stale data (when using long transactions with versioning). Also occurs
if we try delete or update a row that does not exist.

我总是假设第二个,从不看第一个..版本确实是时间戳,在阅读this article之后我也将版本属性修改为很长时间,所有错误都立即消失了。不确定是否存在差异,但它对应用程序逻辑没有任何影响,所以......?

为什么有人想要使用时间戳进行版本控制呢?