2012-09-08 109 views
0

我正在使用JPA 2.0 -EclipseLink和我已經遇到需要實現併發交易的倉庫管理系統,目前我正在執行時間戳差異來驗證上次更改數量的時間戳:添加,刪除,轉移。JPA併發交易策略

這個策略看起來有點缺陷,需要大量的手動驗證,這可能會產生錯誤,JPA框架提供了這種替代方法嗎?

+0

樂觀鎖定不適合你嗎? – home

回答

1

據我所知,你正試圖實現一個帶時間戳的樂觀鎖定策略。

JPA通過版本字段的幫助提供開箱即用的樂觀鎖定機制。基本上,您的實體中有一個版本字段(short,int,longTimestamp),每次修改實體時都會增加/設置版本字段。

如果一個實體在加載時具有與其加載時的版本不同的版本,則拋出一個OptimisticLockingException意味着另一個用戶/線程修改了其中的實體。您可以捕獲此異常,並決定什麼做:

  • 告訴保存的第二重啓其修改用戶
  • 合併修改(如果可能)
  • 覆蓋

這取決於用例。

另見:oracle javaee 6 tutorial on optimistic locking

+0

這是我尋找的東西,我有Origin和Destiny產品的兩個視圖,並且這些視圖可以被併發用戶更新,如果發生這種情況,警告被激活並且用戶必須重新啓動傳輸操作。我將用JPA提供的實現替換我的實現。非常感謝! – Astronaut

+0

那麼你可能不會總能抓住'OptimisticLockingException'。 bean有可能由容器管理,或者有遠程接口。你可能只是得到一個容器發起的ÈJBException',可能甚至沒有包裹起源。所有容器所需要的是_log_'OptimisticLockingException'。如果你需要這個細粒度的控件,確保在業務邏輯結尾的try/catch塊中調用EntityManager#flush方法。如果鎖定失敗,您肯定會收到'OptimisticLockingException',並且可以隨心所欲地執行任何操作。 –