Hibernate事務管理


1.1 Hibernate事務管理

1.1事務介紹

問題:什么是事務?

事務就是邏輯上的一組操作,組成這組操作的各個單元要么全部成功,要么全都失敗。

問題:事務四個特性?

原子性:強調事務是不可分割最小單元

一致性:事務在執行前后,要保證數據的一致。

隔離性:一個事務在執行的過程中,不應該受到其它事務的干擾。

持久性:事務一旦結束,數據持久化到數據庫。

問題:不考慮事務的隔離性,會產生什么問題?

寫問題:丟失更新

1)產生丟失更新的原因

丟失更新就是兩個不同的事務(或者開啟兩個線程)在某一時刻對同一數據進行讀取后,先后進行修改。導致第一次操作數據丟失。

2)解決方式

使用數據庫鎖機制防止數據丟失

(1)共享鎖

共享 (S) 鎖允許並發事務讀取 (SELECT) 一個資源。資源上存在共享 (S) 鎖時,任何其它事務都不能修改數據。一旦已經讀取數據,便立即釋放資源上的共享 (S) 鎖,除非將事務隔離級別設置為可重復讀或更高級別,或者在事務生存周期內用鎖定提示保留共享 (S) 鎖

(2)排它鎖

排它 (X) 鎖可以防止並發事務對資源進行訪問。其它事務不能讀取或修改排它 (X) 鎖鎖定的數據。

 

讀問題:臟讀、不可重復讀、虛度

臟讀:一個事務讀取到另一個事務的未提交數據

【注釋說明】例如在執行update操作時,這個事務未提交,數據庫的數據就沒有發生該表;此時再執行select操作時,第二個事務就能讀取到更新數據之后的數據信息;問題是數據庫的數據沒有發生改變,但select查詢的數據是與數據庫中的數據不一致了。

不可重復讀:一個事務讀取到另一個事務提交的數據(主要是指update),會導致兩次讀取的結果不一致。

虛讀(幻讀): 一個事務讀取到另一個事務提交的數據(主要是指insert),會導致兩次讀取結果不一致.

問題:對於上述問題如何解決?

處理事務:效率越來越低,但安全性越來越高

我們可以通過設置隔離級別來解決讀的問題.

READ_UNCOMMITED 讀取未提交:它引發所有的隔離問題

READ_COMMITTED   讀已提交:  阻止臟讀,可能發生不可重復讀與虛讀.

REPEATABLE_READ   重復讀:    阻止臟讀,不可重復讀:可能發生虛讀

SERIALIZABLE          串行化:   解決所有問題 不允許兩個事務,同時操作一個目標數據。(效率低下,但操作安全是最安全的)

 

ORACLE  默認的是事務隔離級別  READ_COMMITTED

MYSQL  默認的事務隔離級別    REPEATABLE_READ

 

1.2Hibernate中設置事務隔離級別

hibernate.connection.isolation 

它可取的值有 1 2 4 8

1代表的事務隔離級別為  READ UNCOMMITTED

2代表的事務隔離級別為  READ COMMITTED

4.代表的事務隔離級別為  REPEATABLE READ

8代表的事務隔離級別為   SERIALIZABLE

 

hibernate.cfg.xml文件中配置

<!-- 設置事務隔離級別-->

1 < property name=”hibernate.connection.isolation”>4</property>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM