方式有兩種:面試
1)修改配置文件hibernate.cfg.xml實現數據庫
<hibernate-configuration> <session-factory> ...... <!-- 事務隔離級別 0:TRANSACTION_NONE 1:TRANSACTION_READ_UNCOMMITTED 2:TRANSACTION_READ_COMMITTED 4:TRANSACTION_REPEATABLE_READ 8:TRANSACTION_SERIALIZABLE --> <property name="hibernate.connection.isolation">4</property> ...... </session-factory> </hibernate-configuration>
2)代碼方式session
Session session = sessionFactory.openSession(); session.connection().setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
Serializable:串行化。隔離級別最高
Repeatable Read:可重複讀
Read Committed:已提交數據讀
Read Uncommitted:未提交數據讀。隔離級別最差
設置鎖:樂觀鎖和悲觀鎖。
樂觀鎖:使用版本號或時間戳來檢測更新丟失,在的映射中設置 optimistic-lock=」all」能夠在沒有版本或者時間戳屬性映射的狀況下實現 版本檢查,此時Hibernate將比較一行記錄的每一個字段的狀態 行級悲觀鎖:Hibernate老是使用數據庫的鎖定機制,從不在內存中鎖定對象!只要爲JDBC鏈接指定一下隔 離級別,而後讓數據庫去搞定一切就夠了。類LockMode 定義了Hibernate所需的不一樣的鎖定級別:LockMode.UPGRADE,LockMode.UPGRADE_NOWAIT,LockMode.READ;併發
隔離級別性能
Serializable(串行化):可避免髒讀、不可重複讀、虛讀狀況的發生。spa
Repeatable read(可重複讀):可避免髒讀、不可重複讀狀況的發生。hibernate
Read committed(讀已提交):可避免髒讀狀況發生。線程
Read uncommitted(讀未提交):最低級別,以上狀況均沒法保證。code
總結:Serializable隔離級別,雖然可避免全部問題,但性能、效率是最低的,緣由是它採起的是鎖表的方式,即單線程的方式,即有一個事務來操做這個表了,另一個事務只能等在外面進不來。隨着隔離級別的增高,併發性能下降,隨之會引起運行的性能、效率問題
xml
髒讀 dirty reads:當事務讀取還未被提交的數據時,就會發生這種事件。舉例來講:Transaction 1 修改了一行數據,而後 Transaction 2 在 Transaction 1 還未提交修改操做以前讀取了被修改的行。若是 Transaction 1 回滾了修改操做,那麼 Transaction 2 讀取的數據就能夠看做是從未存在過的。
不可重複的讀 non-repeatable reads:當事務兩次讀取同一行數據,但每次獲得的數據都不同時,就會發生這種事件。舉例來講:Transaction 1 讀取一行數據,而後 Transaction 2 修改或刪除該行並提交修改操做。當 Transaction 1 試圖從新讀取該行時,它就會獲得不一樣的數據值(若是該行被更新)或發現該行再也不存在(若是該行被刪除)。
虛讀 phantom read:若是符合搜索條件的一行數據在後面的讀取操做中出現,但該行數據卻不屬於最初的數據,就會發生這種事件。舉例來講:Transaction 1 讀取知足某種搜索條件的一些行,而後 Transaction 2 插入了符合 Transaction 1 的搜索條件的一個新行。若是 Transaction 1 從新執行產生原來那些行的查詢,就會獲得不一樣的行。
髒讀:在一個事務中讀取到另外一個事務沒有提交的數據
不可重複讀:在一個事務中,兩次查詢的結果不一致(針對的update操做)
虛讀(幻讀):在一個事務中,兩次查詢的結果不一致(針對的insert操做)
經過設置數據庫的隔離級別來避免上面的問題(理解)
read uncommitted 讀未提交 上面的三個問題都會出現
read committed 讀已提交 能夠避免髒讀的發生
repeatable read 可重複讀 能夠避免髒讀和不可重複讀的發生
serializable 串行化 能夠避免全部的問題
起初隔離級別爲read uncommitted 讀未提交;a,b兩個會話,分別開啓兩個事務,而後a向b轉了500元錢,但a未提交該事務,
此時b查看,發現多了500.而後a回滾事務,b再查看帳戶,發現根本就沒有多500.這即是髒讀。
髒讀即是能夠讀取到另外一個事務還沒有提交的數據。
若是咱們此時將隔離級別提高爲read committed 讀已提交,即可避免髒讀。一樣b兩個會話,分別開啓兩個事務,而後a向b轉了500元錢,
但a未提交該事務,此時b查看,依舊是原錢數.
但此時,若是a 提交事務,b再去查看,發現此時多了500,對b而言,在一個事務中,兩次查詢的結果不一致,這即是不可重複讀。
若是咱們此時將隔離級別提高爲repeatable read 可重複讀,能夠避免髒讀和不可重複讀的發生。一樣a 提交事務,b再去查看,發現
依舊是原錢數,b只能結束當前事務,在開啓一個新事務,才能查詢到數據的變化,這al便避免了不可重複讀。
若是咱們設置了seriizable串行化,就至關於鎖表,某一時間內只容許一個事務訪問該表。
補充:關於事務,在面試中被問到的機率是很高的,能夠問的問題也是不少的。 首先須要知道的是,只有存在併發數據訪問時才須要事務。當多個事務訪問同一數據時, 可能會存在5類問題,包括3類數據讀取問題(髒讀、不可重複讀和幻讀)和2類數據更新問題(第1類丟失更新和第2類丟失更新)。 第1類丟失更新:事務A撤銷時,把已經提交的事務B的更新數據覆蓋了。 第2類丟失更新:事務A覆蓋事務B已經提交的數據,形成事務B所作的操做丟失。
隔離級別髒讀不可重複讀幻讀第一類丟失更新第二類丟失更新
READ UNCOMMITED容許容許容許 不容許 容許
READ COMMITTED不容許容許容許 不容許 容許
REPEATABLE READ不容許不容許容許 不容許 不容許
SERIALIZABLE不容許不容許不容許 不容許 不容許