事務:
事務通俗說就是邏輯上的一組操作,要麼全都成功,要麼全都失敗!!!
事務有四個特性,簡稱為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不需要進行關閉,線程結束後自動關閉!!!否則報異常!