我使用Spring Data Data JPA save(Object entity) method從多線程Web應用程序保存對象。休眠過時對象
偶爾我發現,當我加載的對象從使用會話:
從會話返回的對象是陳舊的,並不能反映來自數據庫的最新版本。我只是從這個應用程序保存數據,並且只使用Spring Data JPA 接口的一個實例。
什麼可能導致它,我應該如何解決這個問題?
我使用Spring Data Data JPA save(Object entity) method從多線程Web應用程序保存對象。休眠過時對象
偶爾我發現,當我加載的對象從使用會話:
從會話返回的對象是陳舊的,並不能反映來自數據庫的最新版本。我只是從這個應用程序保存數據,並且只使用Spring Data JPA 接口的一個實例。
什麼可能導致它,我應該如何解決這個問題?
Hibernate使用PreparedStatement#executeUpdate結果來檢查更新的行數。如果沒有行匹配,則會拋出StaleObjectStateException(使用Hibernate API時)或OptimisticLockException(使用JPA時)。
Optimistic locking是一個通用目的的併發控制技術,它的工作原理爲物理和application-level transactions。
因此,當多個併發請求修改相同的共享持久數據時,陳舊的異常可以防止「丟失更新」現象。
在應用程序級事務中,一旦加載實體,由於第一級緩存(持久性上下文),您將獲得邏輯可重複讀取,但其他用戶仍然可以修改上述實體。
因此,您確實可以遇到過時的實體,但樂觀鎖定機制可以防止丟失更新而不需要任何額外的數據庫鎖定,甚至可以用於長時間的會話。
其他用戶如何?我只有一個應用程序。 – 2014-09-30 13:06:17
即使是單個應用程序也可能被多個併發請求訪問。 – 2014-09-30 13:12:42
是的,但是所有的請求都是由單例EntityManager處理的。 EntityManager不應該有任何陳舊的數據。 – 2014-10-06 14:18:24
我檢查了緩存,它使用@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) – 2014-09-23 13:20:11