hibernate支援樂觀鎖。當多個事務同時對資料庫表中的同一條資料操作時,如果沒有加鎖機制的話,就會產生髒資料(duty data)。hibernate有2種機制可以解決這個問題:樂觀鎖和悲觀鎖。這裡我們只討論樂觀鎖。
hibernate樂觀鎖,能自動檢測多個事務對同一條資料進行的操作,並根據先勝原則,提交第乙個事務,其他的事務提交時則丟擲org.hibernate.staleobjectstateexception異常。
hibernate樂觀鎖是怎麼做到的呢?
column="version"
type="integer"/>
告訴hibernate version作為版本控制用,交由它管理。
當然在entity class裡也需要給version加上定義,定義的方法跟其他字段完全一樣。
private integer version;
…// setversion() && getversion(integer)
hibernate樂觀鎖的的使用:
session session1 = sessionfactory.opensession();
session session2 = sessionfactory.opensession();
myentity et1 = session1.load(myentity.class, id);
myentity et2 = session2.load(myentity.class, id);
//這裡 et1, et2為同一條資料
transaction tx1 = session1.begintransaction();
//事務1開始
et1.setname(「entity1」);
//事務1中對該資料修改
tx1.commit();
session1.close();
//事務1提交
transaction tx2 = session2.begintransaction();
//事務2開始
et2.setname(「entity2」);
//事務2中對該資料修改
tx2.commit();
session2.close();
//事務2提交
在事務2提交時,因為它提交的資料比事務1提交後的資料舊,所以hibernate會丟擲乙個org.hibernate.staleobjectstateexception異常。
回到前面的問題,hibernate怎麼知道事務2提交的資料比事務1提交後的資料舊呢?
因為myentity有個version版本控制字段。
回頭看看上面的源**中的:
myentity et1 = session1.load(myentity.class, id);
myentity et2 = session2.load(myentity.class, id);
這裡,et1.version==et2.version,比如此時version=1,
當事務1提交後,該資料的版本控制欄位version=version+1=2,而事務2提交時version=1<2所以hibernate認為事務2提交的資料為過時資料,丟擲異常。
這就是hibernate樂觀鎖的原理機制。
我們已經知道了hibernate樂觀鎖是根據version的值來判斷資料是否過時,也就是說,在向資料庫update某資料時,必須保證該entity 裡的version欄位被正確地設定為update之前的值,否則hibernate樂觀鎖機制將無法根據version作出正確的判斷。
在我們的web應用中,尤其應該注意這個問題。
第乙個hibernate程式(xml版本)
1.在使用hibernate3.3 的時候使用的包的配置情況 a.b color orange hibernate3.jar color b 這是hibernate的核心包。b.在lib資料夾中的required包中所用的jar包 img c.關於日誌的包,我們需要slf4j的日誌包,需要注意的是需...
Hibernate 檢索策略
在預設情況下,當hibernate從資料庫中載入物件時,會同時載入所有關聯的物件.但實際應用中可能不需要使用其關聯的物件,這樣就可能通過設定hibernate的檢索策略,來優化檢索效能.hiberante提供了3種檢索策略 1 立即檢索 2 延遲檢索 3 迫切左外連線檢索 下面先從概念上去理解,先在...
Hibernate游標超值
配置檔案 on close auto default on close after transaction after statement preparedstatement pst null resultset rs null session session getsession string q...