2016-03-12 65 views
2

使用JPA樂觀鎖定,我們可以通過@Version字段控制數據庫表是否已被另一個事務同時更新,從而允許在數據庫中存儲可靠的數據。JPA樂觀鎖定vs同步Java方法

如果Java應用程序只有一個負責數據庫中特定實體的CRUD服務,我們可以同步它的方法並管理信息存儲在數據庫中的順序。

所以我的問題是,這些情況之間有什麼區別?是否存在績效優勢,甚至是最佳實踐?方法同步

回答

1

缺點:

  1. 你會序列化所有屬於該實體類的實體實例的更新。兩個併發線程將無法更新兩個不同的實例。
  2. 它在羣集中不起作用。
  3. 維護比較困難。如果對實體的操作變得更加複雜,因此可以在多個服務中更新實體,或者您需要在同一事務中更新不同實體類的實例,則必須將它們全部同步。
  4. 點3)增加了死鎖的機率。
  5. 您必須確保執行持有必要同步鎖定的整個事務,否則,如果在提交事務之前釋放鎖定,併發事務可能會獲得鎖定並繼續更改相同的數據。
  6. 根據使用情況,即使線程/事務不是併發的,沒有版本控制,也不知道數據是否在此期間發生了更改(例如,您獲取數據,根據數據修改客戶端上的某些內容,然後別人改變這些數據,然後你保存你的修改)。
1

將同步視爲悲觀鎖定:在開始工作之前,必須預留鎖定,而不是檢查是否只有在完成工作時(提交期間的樂觀鎖定)才違反鎖定。 兩個發球局有不同的用途:

  • 樂觀鎖是唯一有保證沒有不一致的數據庫狀態(可防止覆蓋數據不知情的情況),但它並不能保證你不會得到一個OptimisticLockException一個無法改變db行。基於這個原因,樂觀鎖定的性能要好得多。
  • 悲觀鎖保證你一定會寫一排,你就會知道它的最先進的日期值(只要你同步無處不在您使用本實體)

一般來說:不要使用同步鎖定實體,JPA鎖定實際DB行時存在悲觀鎖定支持:http://docs.oracle.com/javaee/6/tutorial/doc/gkjiu.html