java 樂觀鎖悲觀鎖專案實際應用
阿新 • • 發佈:2019-02-06
悲觀鎖:簡單的理解就是把需要的資料全部加鎖,在事務提交之前,這些資料全部不可讀取和修改。
樂觀鎖:使用對資料進行版本校驗和比較,來對保證本次的更新時最新的,否則就失敗。
------樂觀鎖 通過JPA 表中加入 @Version
JPA通過在實體類(POJO)中使用@Version註解來發現資料庫記錄的併發操作。當JPA執行時檢測到一個併發操作也在試圖更改同一條記錄。它會丟擲一個嘗試提交的事務異常。
下面是一個帶有@Version註解欄位的類:
- @Entity
- publicclass MyEntity implements Serializable {
- @Id
- @GeneratedValue
- private Long id;
- private String name;
- @Version
- private Long version;
- }
- 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的這行記錄,就被鎖住,在事務提交之前,他不可被其他事務讀取和修改。