hibernate悲觀鎖和樂觀鎖
摘自:hibernate支援兩種鎖機制:
悲觀鎖和樂觀鎖
悲觀鎖,借助資料庫的加鎖機制,下面的**實現了對查詢記錄的加鎖:
string hql = "from user where user.name = '小唯'";
query query = session.createquery(hql);
query.setlockmode("user",lockmode.upgrade);
list list = query.list();
加鎖一般通過以下方法實現:
criteria.setlockmode
query.setlockmode
session.lock
樂觀鎖,大多是基於資料版本(version)記錄機制實現。為資料庫表增加version欄位實現樂觀鎖,每次讀取資料時,將version一併讀出,當修改資料時將version值加一,然後與資料庫中的version對比,如果比資料庫表的version值大,則予以更新,否則不更新。實現步驟:
1.在需要新增樂觀鎖的對映檔案中class標籤新增:optimistic - lock = " version " ;
2.接下來在對應對映檔案class標籤下新增version屬性描述:,此version標籤必須僅次於id標籤;
悲觀鎖與樂觀鎖的比較:
悲觀鎖大多數情況下依靠資料庫的鎖機制實現,以保證操作最大程度的獨占性。但隨之而來的就是資料庫效能的大量開銷,特別是對長事務而言,這樣的開銷往往無法承受;
樂觀鎖機制採取了更加寬鬆的加鎖機制。樂觀鎖機制往往基於系統中的資料儲存邏輯,因此也具備一定的侷限性,如在上例中,由於樂觀鎖機制是在我們的系統中實現,來自外部系統的更新操作不受我們系統的控制,因此可能會造成髒資料被更新到資料庫中。在
系統設計階段,我們應該充分考慮到這些情況出現的可能性,並進行相應調整(如將樂觀鎖策略在資料庫儲存過程中實現,對外只開放基於此儲存過程的資料更新途徑,而不是將資料庫表直接對外公開)。
hibernate 在其資料訪問引擎中內建了樂觀鎖實現。如果不用考慮外部系統對資料庫的更新操作,利用hibernate提供的透明化樂觀鎖實現,將大大提公升我們的生產力。
hibernate中可以通過class描述符的optimistic-lock屬性結合version描述符指定。
通過version實現的樂觀鎖機制是hibernate官方推薦的樂觀鎖實現,同時也是hibernate中,目前唯一在資料物件脫離session 發生修改的情況下依然有效的鎖機制。因此,一般情況下,我們都選擇version方式作為hibernate樂觀鎖實現機制。
恆之貴,何必三更起五更睡;最怕是,一日曝十日寒。
——港灣小唯與君共勉
通過version實現的樂觀鎖機制是hibernate官方推薦的樂觀鎖實現,同時也是hibernate中,目前唯一在資料物件脫離session 發生修改的情況下依然有效的鎖機制。因此,一般情況下,我們都選擇version方式作為hibernate樂觀鎖實現機制。
通過version實現的樂觀鎖機制是hibernate官方推薦的樂觀鎖實現,同時也是hibernate中,目前唯一在資料物件脫離session 發生修改的情況下依然有效的鎖機制。因此,一般情況下,我們都選擇version方式作為hibernate樂觀鎖實現機制。
Hibernate基礎知識整理(四)
事務的邊界 開啟事務 transcation tx session.begintransaction 提交事務 tx.commit 回滾事務 tx.rollback hibernate的事務是通過呼叫jdbc來直接實現的,預設hibernate事務是不開啟的。通常事務的邊界控制是放在service層...
Hibernate 基礎知識
hibernate的基本組成 實體類,實體類的對映檔案,hibernate的配置檔案 hibernate中的常用介面 讀取hibernate的配置檔案。概述 configuration 類負責管理hibernate 的配置資訊,即 載入hibernate配置檔案 hibernate.cfg.xml ...
Hibernate基礎知識
結構 pojo類 對映 xml檔案 註解 表 hibernate api 翻譯jdbc 操作db 1,核心配置檔案 hibernate.cfg.xml 一般不會更改該檔案的名字 2,jar檔案 手動把需要的配置檔案和jar包拷貝到工程中。通常建立個hbn lib的library 四 hibernat...