事務的概念
事務是訪問數據庫時,可能更新數據庫中各種數據項的一個程序執行單元,用來確保數據的完整性,避免數據庫中的數據在不正確的操作下引起的錯誤更改。
事務的4個特性
1.原子性。指事務執行單元是一個不可分割的單元,這些單元要麼都執行,要麼都不執行。
2.一致性。指無論執行了什麼操作,都應該保證數據的完整性和業務邏輯的一致性。
3.隔離性。在事務執行過程中,多個執行單元間操作的數據都是其它單元沒有操作或者操作結束後的數據,保證每一個執行單元操作的數據都有完整的數據空間。
4.持久性。事務結束後,執行單元操作的數據被保存在數據庫中,這些數據的保存狀態是永久性的,不會因爲系統故障而消失。
Hibernate框架中支持兩種事務處理方式
(1) JDBC事務處理 (2) JTA (Java Transaction API)事務處理
這兩種事務處理方式默認情況下都是關閉的,可以通過配置開啓事務管理,如果不進行配置,會默認使用JDBC事務。
(1)編程過程中應用JDBC事務管理的流程
1.實例化Configure類讀取配置文件或者屬性文件
2.獲取sessionFactory實例
3.通過sessionFactory獲得session實例
4.通過session.beginTransaction()獲得事務Transaction對象
5.開始事務,進行數據操作
6.提交事務,數據處理結束後提交事務
7.回滾事務,如果數據處理出現異常則回滾事務,恢復原始數據
8.提交事務,關閉session
(2)編程過程中應用JTA事務管理的流程
概念--JTA是J2EE事務服務的標準解決方式,通過容器來控制事務。主要應用在多數據庫操作的分佈式系統中。JTA事務處理首先創建事務處理對象,然後實例化Session,它的事務生命週期要比session的生命週期長。另外,JTA事務處理和JDBC事務處理不能同時使用。流程如下:
1.創建JTA事務對象
2.開始事務
3.獲得session並編寫操作數據的方法
4.關閉session
5.提交事務
6.如果遇到到異常事件則回滾事務
事務的併發控制?
首先,什麼是併發?在Hibernate應用中,併發主要是指同一個時間段內多個事務共同請求同一個資源。對於併發如果不進行相應的控制,將產生一系列的問題。
其次,併發會產生哪些問題?
(1)第一類丟失更新:當兩個或多個事務同時更新同一資源時,第一個事務已經更新了數據,而第二個事務由於被中斷而撤消了事務,導致第一個事務也被撤消,那麼數據將恢復到原始的狀態。
(2)髒讀:當兩個或多個事務同時操作一個資源時,第一個事務更新了數據但未提交,此時第二個事務讀取了該條數據並進行了處理,此時由於第一個事務被某種原因撤消了,那麼第二個事務處理的數據就稱之爲髒數據。
(3)虛讀:虛讀是由於當前的一個事務查詢到了另一個事務新插入的數據而引起的,當第一個事務查詢了數據庫的記錄數時,第二個事務向數據庫中增加了一條數據,改變了當前的記錄數目,那麼第一個事務獲得的數據就是虛讀的數據,該數據與數據庫中的實際數據不相同。
(4)不可重複讀:當第一個事務修改數據時,第二個事務在它的提交事務的前後,兩次讀取了第一個事務所修改的數據,導致第二個事務兩次讀的數據不匹配。
(5)第二類丟失更新:它是不可重複讀的一個特例,當多個事務同時讀取到了一條資源記錄,分別根據自身的邏輯進行處理,最後分別提交事務。問題發生在最後提交的事務會覆蓋前面所有提交的事務的數據,導致數據最終的完整性被破壞。
併發控制的解決方案?
爲了解決在事務併發過程中出現的問題,Hibernate提供了一種特殊的處理方式----鎖。鎖有兩種形式:悲觀鎖和樂觀鎖。
悲觀鎖:認爲所有的事務都在請求當前事務正在處理的資源,因此將正在處理的數據資源上鎖,其它所有事務都不可以訪問上鎖的資源。只有當前的事務提交後,其它事務纔可以訪問剛剛被提交的數據。Query類和Criteria類的 setLockMode()方法及Session類的load()和lock()方法都可以進行加鎖。鎖定模式如下:
樂觀鎖:認爲訪問數據庫的事務很少發生數據訪問錯誤等問題。當數據出現了不一致的狀態時,Hibernate採用版本檢查和時間戳等技術來實現讀取數據。
——(1)版本控制:版本控制技術是在操作的數據表中增加一個版本號字段,習慣上將該版本號命名爲version,當一個新事務到來時,首先加載版本號,如果版本號和數據庫中的版本號相等,那麼允許事務進行數據操作,否則給出警告信息,數據操作人員可以選擇繼續還是放棄當前的操作。注意:使用版本控制技術是通過程序實現在鎖定機制,如果一個事務更改了版本信息,那麼另一個事務必須先獲得新的版本號以後纔可以進行數據操作。
——(2)時間戳:使用時間戳就是在數據表中增加一個時間類型的版本號,操作數據的事務必須匹配當前的時間纔可以進行數據操作。
鎖的使用原則:
對於數據訪問頻率較低並且一旦產生衝突後果極其嚴重的的情況應該使用悲觀鎖;對於要求性能和效率的數據訪問頻率高,即使發生數據衝突後果也不是很嚴重的情況可以使用樂觀鎖。
最後,歡迎訪問風格清新簡潔的輕博客網站[指尖一刻]