2011-08-26 78 views
4

我正在使用OpenJPA,並遇到鎖定問題。我已經理解什麼是OptimisticLockException,以及它何時拋出。如何禁用JPA的鎖定系統?

但是我該如何處理呢?

在*下方,您可以找到一個關於樂觀鎖定例外的小段落。

簡而言之,我如何完全禁用鎖管理器?

在我的persistent.xml中,我有下面的xml代碼,但它不起作用。爲什麼?

... 
<properties> 
    <property name="openjpa.LockManager" value="none" /> 
</properties> 
... 

*根據有關Java持久性的維基:

處理樂觀鎖異常

不幸的是程序員經常可以對自己好太聰明瞭。使用樂觀鎖定時出現的第一個問題是發生OptimisticLockException時應該怎麼做。友好的鄰居超級程序員的典型反應是自動處理異常。他們只會創建一個新的事務,刷新對象以重置其版本,並將數據合併回對象並重新提交。 Presto問題解決了,還是它?

這實際上違背了擺在首位鎖定整點。如果這是你的願望,你可以不使用鎖定。不幸的是,OptimisticLockException應該很少被自動處理,並且你真的需要打擾用戶這個問題。您應該向用戶報告衝突,並且或者說「發生了抱歉,但發生了編輯衝突,並且他們將不得不重做他們的工作」,或者在最好的情況下,刷新對象並向用戶提供當前數據以及他們提交的數據並幫助他們將兩者合併在一起。

有些自動化的合併工具會比較兩個版本衝突的數據,如果沒有各個字段的衝突,則數據將只是沒有用戶的援助會自動合併。這是大多數軟件版本控制系統所做的。不幸的是,用戶通常能夠更好地判斷何時發生衝突而不是程序,這是因爲兩個版本的.java文件沒有改變同一行代碼並不意味着沒有衝突,第一個用戶可能已經刪除了另一個用戶添加了一個方法來引用的方法,以及其他一些可能導致典型的夜間構建經常被破壞的問題。

+3

該文章正好解釋說,處理這種異常的好方法大多數時間只是告知用戶它。如果你想禁用樂觀鎖定,爲什麼你首先在你的實體中有一個版本字段來啓用它。只是不要放任何版本字段,並且不會有任何樂觀的鎖定。 –

+0

是的,但問題是我不想向用戶報告「嘿,男人,有鎖!」。用戶不關心這個錯誤。那麼,處理鎖定的最佳方法是什麼?我真的不明白我必須做什麼。 –

+0

如果兩個用戶同時修改一個實體,並且最後一次修改獲勝,那麼這是一個問題嗎?如果是問題,請使用樂觀鎖定,並在出現問題時通知用戶。這是沒有辦法的。如果這不是問題,那麼不要使用樂觀鎖定。最後的修改,如果它沒有破壞數據庫中的約束,將永遠贏。但是讓併發用戶修改相同的數據總是會導致異常(例如,因爲某些用戶可能會在某個其他用戶向同一實體提交修改之前刪除該實體)。 –

回答

4

但是我該如何處理呢?

這取決於您的應用程序......您需要做最有意義的事情。也許你需要提示你的用戶數據被同時修改,然後重新提交新的(er)數據?

雖然我不認爲禁用OptimisticLocking是正確的解決方案,我想設置這兩個屬性將擺脫你所看到的OLES的。

<properties> 
    <property name="openjpa.Optimistic" value="false"/> 
    <property name="openjpa.LockManager" value="none"/> 
</properties>