2011-08-18 99 views
0

我們在項目中使用Spring和Hibernate,並且擁有分層的架構。控制器 - >服務 - >管理器 - >道。事務從管理器層開始。更新數據庫中的對象的服務層中的方法被許多線程調用,這導致拋出一個陳舊的對象期望。所以我讓這個方法同步並仍然看到拋出的過時對象異常。我在這裏做錯了什麼?任何更好的方法來處理這種情況?同步彈簧交易

感謝您的幫助提前。

回答

3

當實體在讀取時間和更新時間之間被修改時,會拋出過時對象異常。這可能發生在單個事務中,但也可能發生在讀取事務中的對象,修改它(例如在控制器層中),然後啓動另一個事務併合並/更新它(在本例中爲分鐘或小時可以分開讀取和更新)。

引發異常可以幫助您避免用戶之間的衝突。

如果您不關心衝突(即上次更新始終獲勝並替換之前的更新),則不要使用樂觀鎖定。如果您擔心衝突,則StaleObjectExceptions將發生,並且您應該向最終用戶彈出一條有意義的消息,要求他重新加載數據並嘗試再次修改它。沒有辦法避免它們。你必須保持樂觀,並希望他們不會經常發生。

請注意,您同步的伎倆將工作只有

  • 例外閱讀和在同一個事務
  • 更新到實體只能通過此服務
  • 您的應用程序是由書寫時只發生不聚集。

它也可能會顯着降低吞吐量,因爲您禁止任何併發更新,無論哪些實體由併發事務更新。就好像你在整個交易期間鎖定整個表格一樣。