2013-03-14 96 views
0

我已經繼承了一個應用程序,它執行一些基於觸發器的插入和更新,偶爾會拋出StaleObjectException。我試圖添加很多調試(tx,hibernate,type等),這讓我更加困惑。StaleObjectException,但真的很奇怪

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分鐘。不用說,這通常是一天中大部分時間工作,但突然......

不會自動刷新和提交事務提交?

我假設插入已將數據移到緩存但不是數據庫,在緩存中再次找到,但拒絕更新,因爲它們不在數據庫中。所以問題是,如果任何人有任何偉大的想法?

它是一個oracle數據庫,我試圖確保T2具有Required_new事務,並與isolation_level序列化,但效果不大。我開始認爲插入是不知不覺中,?!

任何建議welcom

回答

0

嗯,我自己找到了答案。

我偶然發現的Javadoc StaleObjectStateException in Hibernate ver 2

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. 

我一直以爲第二,從來不看first..Version確實時間戳和閱讀this article以及之後我修改的版本屬性到很久以後,所有的錯誤都消失了。不確定差異,但它對應用程序邏輯沒有影響,所以..?

爲什麼有人想使用時間戳進行版本控制呢?