hibernate 事務處理

Hibernate的事務處理:
事務:
* 事務就是邏輯上的一組操做,要麼全都成功,要麼全都失敗!!!

事務特性:
* 原子性:事務一組操做不可分割.
* 一致性:事務的執行先後,數據完整性要保持一致.
* 隔離性:一個事務在執行的過程當中不該該受到其餘事務的干擾.
* 持久性:一旦事務結束,數據就永久保存數據庫.

若是不考慮事務的隔離性引起一些安全性問題:
* 5大類問題:3類讀問題 2類寫問題.
* 讀問題:
* 髒讀                  :一個事務讀到另外一個事務未提交數據.
* 不可重複讀     :一個事務讀到另外一個事務已經提交數據(update),致使查詢結果不一致.
* 虛讀                  :一個事務讀到另外一個事務已經提交的數據(insert),致使查詢結果不一致

* 避免三種讀的問題:
* 設置事務的隔離級別:
* 未提交讀:以上三種讀問題 都有可能發生.
* 已提交讀:避免髒讀,可是不可重複讀和虛讀有可能發生.
* 重複讀:避免髒讀和不可重複讀,可是虛讀是有可能發生.
* 串行的:能夠避免以上三種讀問題.

* 在Hibernate中設置事務的隔離級別:
* 在覈心配置文件中:
<property name="hibernate.connection.isolation">4</property>數據庫

寫問題:丟失更新
* 解決;
* 悲觀鎖:當一個事務正在進行時,其餘事務不容許修改數據。緩存

@Test
/*
 * 使用悲觀鎖解決丟失更新
 */
public void demo1(){
    Session session = HibernateUtils.openSession();
    Transaction tx = session.beginTransaction();
    
    // 使用悲觀鎖(拍他鎖)
    Customer customer = (Customer) session.get(Customer.class, 3, LockMode.UPGRADE);
    customer.setAge(32);
    
    tx.commit();
    session.close();
}
    
@Test
/*
 * 使用悲觀鎖解決丟失更新
 */
public void demo2(){
    Session session = HibernateUtils.openSession();
    Transaction tx = session.beginTransaction();
    
    // 使用悲觀鎖(拍他鎖)
    Customer customer = (Customer) session.get(Customer.class, 3, LockMode.UPGRADE);
    customer.setCname("老湯姆");
    
    tx.commit();
    session.close();
}


* 樂觀鎖:安全

在映射文件中加一句<version name="version"/>,session

在Customer實體類中加一個屬性 version性能

標籤version是固定的,name裏面的屬性能夠隨意取名,爲方便區分,version更好。spa

@Test
/*
 * 使用樂觀鎖解決丟失更新
 */
public void demo3(){
    Session session = HibernateUtils.openSession();
    Transaction tx = session.beginTransaction();
    
    Customer customer = (Customer) session.get(Customer.class, 3);
    customer.setAge(26);
    
    tx.commit();
    session.close();
}

@Test
/*
 * 使用樂觀鎖解決丟失更新
 */
public void demo4(){
    Session session = HibernateUtils.openSession();
    Transaction tx = session.beginTransaction();
    
    Customer customer = (Customer) session.get(Customer.class, 3);
    customer.setCname("老湯姆");
    
    tx.commit();
    session.close();
}

關於悲觀鎖和樂觀鎖更清晰的講述:.net

悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿數據的時候都認爲別人會修改,因此每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖。傳統的關係型數據庫裏邊就用到了不少這種鎖機制,好比行鎖,表鎖等,讀鎖,寫鎖等,都是在作操做以前先上鎖。hibernate

 

樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿數據的時候都認爲別人不會修改,因此不會上鎖,可是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可使用版本號等機制。樂觀鎖適用於多讀的應用類型,這樣能夠提升吞吐量,像數據庫若是提供相似於write_condition機制的其實都是提供的樂觀鎖。code

 

兩種鎖各有優缺點,不可認爲一種好於另外一種,像樂觀鎖適用於寫比較少的狀況下,即衝突真的不多發生的時候,這樣能夠省去了鎖的開銷,加大了系統的整個吞吐量。但若是常常產生衝突,上層應用會不斷的進行retry,這樣反卻是下降了性能,因此這種狀況下用悲觀鎖就比較合適。blog

原文:http://blog.csdn.net/hongchangfirst/article/details/26004335

 

另外關於二級緩存,,

相關文章
相關標籤/搜索