0

我继承了一个应用程序,它执行一些基于触发器的插入和更新,偶尔会抛出 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 提交,并且确实将具有 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 分钟。不用说,这通常在一天中的大部分时间都有效,但突然之间......

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

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

它是一个 oracle 数据库,我试图确保 T2 具有Required_new 事务,并且对isolation_level 进行了序列化,但效果不大。我开始认为插入以某种方式未提交,?!

欢迎任何建议

4

1 回答 1

0

好吧,我自己找到了答案。

我偶然发现了Hibernate ver 2 中 StaleObjectStateException的 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.

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

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

于 2013-03-19T07:57:05.207 回答