天天看點

Hibernate進階(三)Hibernate樂觀鎖與悲觀鎖前言方法

前言

      本章講解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。

實體類編寫如下:

Hibernate進階(三)Hibernate樂觀鎖與悲觀鎖前言方法

3.悲觀鎖

悲觀鎖的理論和樂觀鎖恰恰相反,但是實作效果一緻!

他認為,我們一旦對一條記錄進行操作,那麼為了避免并發問題,直接在該條資料上加鎖!

也就是說,當事務A對某行資料進行操作的時候,事務B無法對該條資料同時進行操作

  • 優點:會鎖住記錄,一個使用者操作完成前,其他使用者無法操作
  • 缺點:并發性不好,性能較低

實作方式:

1)悲觀鎖的幾種方式:

  • LockMode.NONE:無鎖機制
  • LockMode.WRITE:進行insert或者update時加鎖
  • LockMode.READ:進行read時加鎖
  • ......

2)悲觀鎖的實作

在get方法後還有第三個參數,該參數用來設定悲觀鎖!

示例:

session.get(Emp.class,1, LockMode.WRITE);
           

但是目前hibernate4已經不建議使用該參數了!

繼續閱讀