我們在項目中使用Spring和Hibernate,並且擁有分層的架構。控制器 - >服務 - >管理器 - >道。事務從管理器層開始。更新數據庫中的對象的服務層中的方法被許多線程調用,這導致拋出一個陳舊的對象期望。所以我讓這個方法同步並仍然看到拋出的過時對象異常。我在這裏做錯了什麼?任何更好的方法來處理這種情況?同步彈簧交易
感謝您的幫助提前。
我們在項目中使用Spring和Hibernate,並且擁有分層的架構。控制器 - >服務 - >管理器 - >道。事務從管理器層開始。更新數據庫中的對象的服務層中的方法被許多線程調用,這導致拋出一個陳舊的對象期望。所以我讓這個方法同步並仍然看到拋出的過時對象異常。我在這裏做錯了什麼?任何更好的方法來處理這種情況?同步彈簧交易
感謝您的幫助提前。
我的猜測是,你需要在Hibernate方面configure optimistic locking。
當實體在讀取時間和更新時間之間被修改時,會拋出過時對象異常。這可能發生在單個事務中,但也可能發生在讀取事務中的對象,修改它(例如在控制器層中),然後啓動另一個事務併合並/更新它(在本例中爲分鐘或小時可以分開讀取和更新)。
引發異常可以幫助您避免用戶之間的衝突。
如果您不關心衝突(即上次更新始終獲勝並替換之前的更新),則不要使用樂觀鎖定。如果您擔心衝突,則StaleObjectExceptions將發生,並且您應該向最終用戶彈出一條有意義的消息,要求他重新加載數據並嘗試再次修改它。沒有辦法避免它們。你必須保持樂觀,並希望他們不會經常發生。
請注意,您同步的伎倆將工作只有
它也可能會顯着降低吞吐量,因爲您禁止任何併發更新,無論哪些實體由併發事務更新。就好像你在整個交易期間鎖定整個表格一樣。