新聞中心
Spring 中的事務隔離級別和數(shù)據(jù)庫中的事務隔離級別稍有不同,以 MySQL 為例,MySQL 的 InnoDB 引擎中的事務隔離級別有 4 種,而 Spring 中卻包含了 5 種事務隔離級別。

創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站設計制作、做網(wǎng)站與策劃設計,高縣網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設10余年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:高縣等地區(qū)。高縣做網(wǎng)站價格咨詢:18982081108
1、什么是事務隔離級別?
?事務隔離級別是對事務 4 大特性中隔離性的具體體現(xiàn),使用事務隔離級別可以控制并發(fā)事務在同時執(zhí)行時的某種行為。
比如,有兩個事務同時操作同一張表,此時有一個事務修改了這張表的數(shù)據(jù),但尚未提交事務,那么在另一個事務中,要不要(或者說能不能)看到其他事務尚未提交的數(shù)據(jù)呢?
這個問題的答案就要看事務的隔離級別了,不同的事務隔離級別,對應的行為模式也是不一樣的(有些隔離級別可以看到其他事務尚未提交的數(shù)據(jù),有些事務隔離級別看不到其他事務尚未提交的數(shù)據(jù)),這就是事務隔離級別的作用。
2、Spring 事務隔離級別
Sping 中的事務隔離級別有 5 種,它們分別是:
- DEFAULT:Spring 中默認的事務隔離級別,以連接的數(shù)據(jù)庫的事務隔離級別為準。
- READ_UNCOMMITTED:讀未提交,也叫未提交讀,該隔離級別的事務可以看到其他事務中未提交的數(shù)據(jù)。該隔離級別因為可以讀取到其他事務中未提交的數(shù)據(jù),而未提交的數(shù)據(jù)可能會發(fā)生回滾,因此我們把該級別讀取到的數(shù)據(jù)稱之為臟數(shù)據(jù),把這個問題稱之為臟讀。
- READ_COMMITTED:讀已提交,也叫提交讀,該隔離級別的事務能讀取到已經(jīng)提交事務的數(shù)據(jù),因此它不會有臟讀問題。但由于在事務的執(zhí)行中可以讀取到其他事務提交的結(jié)果,所以在不同時間的相同 SQL 查詢中,可能會得到不同的結(jié)果,這種現(xiàn)象叫做不可重復讀。
- REPEATABLE_READ:可重復讀,它能確保同一事務多次查詢的結(jié)果一致。但也會有新的問題,比如此級別的事務正在執(zhí)行時,另一個事務成功的插入了某條數(shù)據(jù),但因為它每次查詢的結(jié)果都是一樣的,所以會導致查詢不到這條數(shù)據(jù),自己重復插入時又失?。ㄒ驗槲ㄒ患s束的原因)。明明在事務中查詢不到這條信息,但自己就是插入不進去,這就叫幻讀 (Phantom Read)。
- SERIALIZABLE:串行化,最高的事務隔離級別,它會強制事務排序,使之不會發(fā)生沖突,從而解決了臟讀、不可重復讀和幻讀問題,但因為執(zhí)行效率低,所以真正使用的場景并不多。
所以,相比于 MySQL 的事務隔離級別,Spring 中多了一種 DEFAULT 的事務隔離級別。
事務隔離級別與問題的對應關系如下:
- 臟讀:一個事務讀取到了另一個事務修改的數(shù)據(jù)之后,后一個事務又進行了回滾操作,從而導致第一個事務讀取的數(shù)據(jù)是錯誤的。
- 不可重復讀:一個事務兩次查詢得到的結(jié)果不同,因為在兩次查詢中間,有另一個事務把數(shù)據(jù)修改了。
- 幻讀:一個事務兩次查詢中得到的結(jié)果集不同,因為在兩次查詢中另一個事務有新增了一部分數(shù)據(jù)。
3、設置事務隔離級別
在 Spring 中,事務的隔離級別有 2 種設置方法,一種是在編程式事務中,可以通過以下代碼來設置事務隔離級別:
另一種是在聲明式事務中設置事務隔離級別,設置方法如下:
總結(jié)
Spring 中的事務隔離級別比 MySQL 中的事務隔離級別多了一種,它包含的 5 種隔離級別分別是:
- Isolation.DEFAULT:默認的事務隔離級別,以連接的數(shù)據(jù)庫的事務隔離級別為準。
- Isolation.READ_UNCOMMITTED:讀未提交,可以讀取到未提交的事務,存在臟讀。
- Isolation.READ_COMMITTED:讀已提交,只能讀取到已經(jīng)提交的事務,解決了臟讀,存在不可重復讀。
- Isolation.REPEATABLE_READ:可重復讀,解決了不可重復讀,但存在幻讀(MySQL 數(shù)據(jù)庫默認的事務隔離級別)。
- Isolation.SERIALIZABLE:串行化,可以解決所有并發(fā)問題,但性能太低。
但需要注意是 Spring 是事務隔離級別是建立在連接的數(shù)據(jù)庫支持事務的基礎上的,如果 Spring 項目連接的數(shù)據(jù)庫不支持事務(或事務隔離級別),那么即使在 Spring 中設置了事務隔離級別,也是無效的設置。
本文題目:面試突擊:Spring有幾種事務隔離級別?
當前URL:http://www.fisionsoft.com.cn/article/cdpsgso.html


咨詢
建站咨詢
