2016-03-07 85 views
2

我對Hibernate非常新穎,而且我有這個緩存處理在hibernate問題上找不到答案。例如,線程A從數據庫中讀取數據,並將其保存在與會話A綁定的一級緩存中,然後線程休眠幾秒鐘。同時,另一個線程B在線程A醒來之前修改了數據庫中的相關數據。那麼,檢索到的數據線程A會發生什麼情況,線程B修改之前的數據還是線程B修改後的數據?Hibernate Session如何處理併發性能

那麼如果將數據保存在二級緩存中會發生什麼情況,這會在數據集成上產生差異嗎?

+0

這種情況被稱爲「不一致的讀取」。 – Bhushan

回答

2

那麼,線程A檢索到的數據會發生什麼,線程B修改之前的數據是 還是線程B修改後的數據?

線程A仍然只有舊數據。因爲,each session有它的own first level cache。要獲取更新的數據session可以再次調用evict(..)load,或者假設線程B已將數據保存到數據庫,則調用refresh(...)方法。

那麼如果數據保存在二級緩存中會發生什麼情況, 會在數據集成上產生差異嗎?

行爲與上面相同。除此之外,如果您在Entity中設置了version屬性,則還可以使用session.lock(...)來檢測實體更改。例如:LockMode.READ將針對數據庫檢查version屬性以檢測對其的任何更改,即通過第二級緩存。

2

「線程A」將看到舊數據,直到它再次從數據庫中讀取數據。