我對Hibernate非常新穎,而且我有這個緩存處理在hibernate問題上找不到答案。例如,線程A從數據庫中讀取數據,並將其保存在與會話A綁定的一級緩存中,然後線程休眠幾秒鐘。同時,另一個線程B在線程A醒來之前修改了數據庫中的相關數據。那麼,檢索到的數據線程A會發生什麼情況,線程B修改之前的數據還是線程B修改後的數據?Hibernate Session如何處理併發性能
那麼如果將數據保存在二級緩存中會發生什麼情況,這會在數據集成上產生差異嗎?
我對Hibernate非常新穎,而且我有這個緩存處理在hibernate問題上找不到答案。例如,線程A從數據庫中讀取數據,並將其保存在與會話A綁定的一級緩存中,然後線程休眠幾秒鐘。同時,另一個線程B在線程A醒來之前修改了數據庫中的相關數據。那麼,檢索到的數據線程A會發生什麼情況,線程B修改之前的數據還是線程B修改後的數據?Hibernate Session如何處理併發性能
那麼如果將數據保存在二級緩存中會發生什麼情況,這會在數據集成上產生差異嗎?
那麼,線程A檢索到的數據會發生什麼,線程B修改之前的數據是 還是線程B修改後的數據?
線程A仍然只有舊數據。因爲,each session
有它的own first level cache
。要獲取更新的數據session
可以再次調用evict(..)
和load
,或者假設線程B已將數據保存到數據庫,則調用refresh(...)
方法。
那麼如果數據保存在二級緩存中會發生什麼情況, 會在數據集成上產生差異嗎?
行爲與上面相同。除此之外,如果您在Entity
中設置了version
屬性,則還可以使用session.lock(...)
來檢測實體更改。例如:LockMode.READ
將針對數據庫檢查version
屬性以檢測對其的任何更改,即通過第二級緩存。
「線程A」將看到舊數據,直到它再次從數據庫中讀取數據。
這種情況被稱爲「不一致的讀取」。 – Bhushan