2010-01-21 44 views
0

考慮一種情況,用戶1使用hibernate(get或load或from customer where name =「gkp」)查詢數據庫,然後獲取數據。之後,DBA通過執行手動更新該特定行db中的更新查詢。如果第二個用戶執行相同的查詢,他將得到更新的數據或舊數據(用戶1看到的數據)。Hibernate多用戶環境

hibernate會將會話結果存儲在會話中並將其返回給第二個用戶。實際發生了什麼?

回答

3

如果您啓用了二級緩存,而第二個用戶將獲得包含舊數據的對象,如果沒有,則包含新數據。除非他們正在使用相同的ISession實例,這是不可取的。

一級緩存處於會話級別;第二級在會話工廠級別。如果你有直接創建的更新,而不是通過NHibernate創建,那麼它們將不會被任何級別的緩存提取出來,所以如果你正在訪問緩存(或者使用不同的會話和二級緩存,或者使用相同的緩存會話),您將看不到已做出的更改。

在這些情況下,使用某種類型的版本列(例如SQL Server時間戳,Oracle ORA_SCN)和樂觀離線鎖定通常是有意義的,以防止更新被實際更新到下一個實體處理。

+0

感謝的解釋,但它有點混亂 //第二個用戶會得到舊的,如果你啓用了二級高速緩存,以及一個新的如果不是// 您//一個新意思一個如果不是?這是否意味着如果我使用一級緩存,那麼第二個用戶獲得更新的值? 如果這就是你試圖說的那麼 爲什麼這個聲明//如果你有更新是直接創建的,而不是通過NHibernate生成的,它們將不會被任何一個緩存層拾取。 你可以請告訴我清楚.. – 2010-01-21 14:16:29

+0

我可以認爲版本是選項,但我看到這個問題時得到的初衷是「每個用戶將有單獨的會話,那麼將不會是一個機會爲同一會話語言一級緩存),第二級也不可能,所以只有一種解決方案是版本化「 糾正我,如果我錯了 謝謝 – 2010-01-21 14:17:21

+0

編輯回答。如果您處於使用NHibernate的環境中,但某些數據更新不是通過NHibernate進行的,並且您希望用戶無法將更改保存到自第一次獲取後更新的行,則是,版本控制絕對是您唯一的選擇。 – 2010-01-22 09:20:49