我继承了一个应用程序,它执行一些基于触发器的插入和更新,偶尔会抛出 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 进行了序列化,但效果不大。我开始认为插入以某种方式未提交,?!
欢迎任何建议