1. 程式人生 > >java 樂觀鎖悲觀鎖專案實際應用

java 樂觀鎖悲觀鎖專案實際應用

悲觀鎖:簡單的理解就是把需要的資料全部加鎖,在事務提交之前,這些資料全部不可讀取和修改。

樂觀鎖:使用對資料進行版本校驗和比較,來對保證本次的更新時最新的,否則就失敗。

------樂觀鎖  通過JPA 表中加入 @Version

JPA通過在實體類(POJO)中使用@Version註解來發現資料庫記錄的併發操作。當JPA執行時檢測到一個併發操作也在試圖更改同一條記錄。它會丟擲一個嘗試提交的事務異常。

下面是一個帶有@Version註解欄位的類:

  1. @Entity
  2. publicclass MyEntity implements Serializable {      
  3.     @Id
  4.     @GeneratedValue
  5.     private Long id;
  6.     private String name;  
  7.     @Version
  8.     private Long version;
  9. }
如果要修改該實體類的資料。帶有註解@Version的version欄位將會自增,就像下面的sql語句:
  1. UPDATE MYENTITY SET ..., VERSION = VERSION + 1 WHERE ((ID = ?) AND (VERSION = ?))  

如果WHERE子句不能匹配記錄(因為相同的實體已經被另一個執行緒更新),那麼永續性提供者將丟擲OptimisticLockException。

這將防止建立兩個一樣的實體類例項。

—————————————————————————————————————————————————————————————————————

悲觀鎖的做法:

select * from user where uid=1 for update;
update user  set name='bac'  where uid=1;

這樣,uid為1的這行記錄,就被鎖住,在事務提交之前,他不可被其他事務讀取和修改。