前言
本章講解Hibernate中關于樂觀鎖和悲觀鎖的基本概念
方法
1.概念
通過前面對事務的學習,我們了解到事務并發過程中存在了諸多的問題,也提供了相應的事務隔離級别來進行解決!當然我們的Hibernate也可以設定這樣的隔離級别:
在hibernate.cfg.xml進行如下配置:
<!--8 - Serializable 串行化
4 - Repeatable Read 可重複讀
2 - Read Commited 可讀已送出
1 - Read Uncommited 可讀未送出-->
<property name="hibernate.connection.isolation">2</property>
而對于Hibernate而言呢,還有一種解決自定義的解決方式,它對于記錄的操作指明了兩個方式,那就是樂觀鎖和悲觀鎖
2.樂觀鎖
從字面了解,那就是樂觀主義态度的鎖機制!
當事務A對某行資料進行操作的時候,事務B也可以對該條資料同時進行操作,如果B修改了資料并送出,那麼A事務對于該條記錄的修改送出将會失敗!
- 優點:并發性好,性能較高
- 缺點:使用者體驗差,當一個使用者修改完資料後送出被告知修改失敗,這将是很苦惱的
實作方式:
在需要加樂觀鎖的實體類中加入版本控制字段version,每次更新後都将版本控制字段加1。
實體類編寫如下:
3.悲觀鎖
悲觀鎖的理論和樂觀鎖恰恰相反,但是實作效果一緻!
他認為,我們一旦對一條記錄進行操作,那麼為了避免并發問題,直接在該條資料上加鎖!
也就是說,當事務A對某行資料進行操作的時候,事務B無法對該條資料同時進行操作
- 優點:會鎖住記錄,一個使用者操作完成前,其他使用者無法操作
- 缺點:并發性不好,性能較低
實作方式:
1)悲觀鎖的幾種方式:
- LockMode.NONE:無鎖機制
- LockMode.WRITE:進行insert或者update時加鎖
- LockMode.READ:進行read時加鎖
- ......
2)悲觀鎖的實作
在get方法後還有第三個參數,該參數用來設定悲觀鎖!
示例:
session.get(Emp.class,1, LockMode.WRITE);
但是目前hibernate4已經不建議使用該參數了!