Hibernate事務處理
事務:
事務通俗說就是邏輯上的一組操作,要麼全都成功,要麼全都失敗!!!
事務有四個特性,簡稱為ACID:
原子性(Atomicity):事務一組操作不可分割.
一致性(Consistency):事務的執行前後,資料完整性要保持一致.
隔離性(Isolation):個事務在執行的過程中不應該受到其他事務的干擾.
永續性(Durability:一旦事務結束,資料就永久儲存資料庫.
有了四大特性,才能保證事務過程中資料的正確性。
其中事務的隔離性最為重要,如果不考慮事務的隔離性引發一些安全性問題:
5大類問題:3類讀問題 2類寫問題.
讀問題:
* 髒讀 :一個事務讀到另一個事務未提交資料.
* 不可重複讀 :一個事務讀到另一個事務已經提交資料(update),導致查詢結果不一致.
* 虛讀 :一個事務讀到另一個事務已經提交的資料(insert),導致查詢結果不一致
避免三種讀的問題:
* 設定事務的隔離級別:
* 未提交讀:以上三種讀問題 都有可能發生.
* 已提交讀:避免髒讀,但是不可重複讀和虛讀有可能發生.
* 重複讀:避免髒讀和不可重複讀,但是虛讀是有可能發生.
* 序列的:可以避免以上三種讀問題.
事務隔離級別:
ANSI SQL 標準定義了隔離級別,但並不是SQL資料庫獨有.JTA也定義了同樣的隔離級別.級別越高,成本越高
設定事務隔離級別
在Hibernate中設定事務的隔離級別:
在核心配置檔案中配置:
<property name="hibernate.connection.isolation">4</property>
注意:
*Hibernate不可能改變在受管環境下由應用伺服器提供的資料庫連線的隔離級別,只能通過改變應用伺服器配置的方式來改變
* 設定隔離級別是全域性選項,會影響所有的連線和事務.有時需要為某個特定事務指定更多的限制.
* Hibernate依賴於樂觀的併發控制,使用版本檢查和悲觀鎖實現附加的鎖支援
寫問題:丟失更新(詳解看之後部落格)
* 解決方法;
* 悲觀鎖
* // 使用悲觀鎖(排他鎖)
Customer customer = (Customer) session.get(Customer.class, 3, LockMode.UPGRADE);
* 樂觀鎖;
* hbm.xml配置一個<version>標籤
session管理(詳解看之後的部落格):
執行緒繫結的session:
* 在核心配置檔案中配置一個:
<property name="hibernate.current_session_context_class">thread</property>
* 使用SessionFactory中的getCurrentSession();方法.
注意:當前執行緒中的session不需要進行關閉,執行緒結束後自動關閉!!!否則報異常!