!何为脏读、不可重复读、幻读
2.0、前言
事務(wù)的隔離性是指多個事務(wù)并發(fā)執(zhí)行的時候相互之間不受到彼此的干擾的特性,隔離性是事務(wù)ACID特性中的I,根據(jù)隔離程度從低到高分為Read Uncommitted(讀未提交),Read Committed(讀已提交),Repeatable Read(可重復(fù)讀),Serializable(串行化)四種隔離級別。在具體介紹事務(wù)隔離性前先介紹幾個名詞,以便說明數(shù)據(jù)庫在并發(fā)操作時候可能存在的問題,以便展開來探討這四種隔離級別對應(yīng)存在哪些問題,哪些隔離級別解決了哪些問題。
2.1 何為臟讀、不可重復(fù)讀、幻讀
- 臟讀
所謂臟讀是指一個事務(wù)中訪問到了另外一個事務(wù)未提交的數(shù)據(jù),如下圖:
image.png
如上圖開啟兩個會話來模擬兩個線程同時去訪問數(shù)據(jù)庫表table中id=1的記錄,假設(shè)兩個會話開啟前數(shù)據(jù)庫中table表中id=1的記錄行里面的列age值為5。會話1和2一開始都開啟了顯示的事務(wù)(只有執(zhí)行commit命令才會提交數(shù)據(jù)的修改),會話2首先更新了table中id=1的記錄行的age列的值為10(更新前值為5),在會話2執(zhí)行commit提交前,會話1通過select語句查詢id=1的記錄行中age列的值,這時候如果存在臟讀,則會話1讀取到的age的值是10而不是5了,雖然會話2的更新還沒有提交。那么臟讀存在什么問題那?如果會話2最后提交了,那么會話1雖然在會話2還沒提交就讀取到了修改的值,但是也沒什么影響;但是如果會話1讀取到會話2沒有提交的數(shù)據(jù)后,會話2執(zhí)行了rollback,也就是沒有把修改刷新到數(shù)據(jù)庫,但是會話1已經(jīng)使用了修改的數(shù)據(jù),這就出現(xiàn)了錯誤。
- 不可重復(fù)讀
所謂不可重復(fù)讀是指在一個事務(wù)內(nèi)根據(jù)同一個條件對行記錄進(jìn)行多次查詢,但是搜出來的結(jié)果卻不一致。發(fā)生不可重復(fù)讀的原因是在多次搜索期間查詢條件覆蓋的數(shù)據(jù)被其他事務(wù)修改了,下面借助圖表來解析下不可重復(fù)讀。image.png
如上圖假設(shè)數(shù)據(jù)庫表table里面id=1的記錄行中age列一開始值為5,然后會話1和會話2分別開啟了一個事務(wù),會話1首先查詢id=1的記錄中age字段值為5,然后會話2修改id=1的記錄中age的值為10然后提交了事務(wù),然后會話1再次搜出id=1的記錄中age的值,如果出現(xiàn)了不可重復(fù)讀,則這時候搜出來的age的值為10而不是5。需要注意的是會話1兩次查詢是在同一個事務(wù)內(nèi)進(jìn)行的,期間事務(wù)并沒有提交。不可重復(fù)讀的存在顯得不是那么不可容忍,畢竟讀取的是已經(jīng)提交了的數(shù)據(jù)。
- 幻讀
所謂幻讀是指同一個事務(wù)內(nèi)多次查詢返回的結(jié)果集不一樣(比如增加了或者減少了行記錄)。比如同一個事務(wù)A內(nèi)第一次查詢時候有n條記錄,但是第二次同等條件下查詢卻又n+1條記錄,這就好像產(chǎn)生了幻覺,為啥兩次結(jié)果不一樣那。其實(shí)和不可重復(fù)讀一樣,發(fā)生幻讀的原因也是另外一個事務(wù)新增或者刪除或者修改了第一個事務(wù)結(jié)果集里面的數(shù)據(jù)。不同在于不可重復(fù)讀是同一個記錄的數(shù)據(jù)內(nèi)容被修改了,幻讀是數(shù)據(jù)行記錄變多了或者少了:image.png
如上圖假設(shè)表table里面一開始有一個id=3的記錄,會話1首先開啟了一個事務(wù),然后查找id>2的記錄,會發(fā)現(xiàn)結(jié)果只有一個記錄,然后會話2開啟事務(wù)插入了id=5的一個記錄,然后提交。這時候會話1再次查找id>2的記錄,如果存在幻讀,則這時候會話1會看到兩條記錄。
注:臟讀是指一個事務(wù)讀取到了其他事務(wù)沒有提交的數(shù)據(jù),不可重復(fù)讀是指一個事務(wù)內(nèi)多次根據(jù)同一個查詢條件查詢出來的同一行記錄的值不一樣,幻讀是指一個事務(wù)內(nèi)多次根據(jù)同個條件查出來的記錄行數(shù)不一樣。為了解決事務(wù)并發(fā)帶來的問題,才有了事務(wù)規(guī)范中的四個事務(wù)隔離級別,不同隔離級別對上面問題部分或者全部做了避免。
最后
更多Spring事務(wù)傳播性與事務(wù)隔離性的咨詢可以單擊我
想了解更多關(guān)于粘包半包問題單擊我
更多關(guān)于分布式系統(tǒng)中服務(wù)降級策略的知識可以單擊 單擊我
想系統(tǒng)學(xué)dubbo的單擊我
想學(xué)并發(fā)的童鞋可以 單擊我
作者:阿里加多
鏈接:https://www.jianshu.com/p/f7ac1b22e899
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。
總結(jié)
以上是生活随笔為你收集整理的!何为脏读、不可重复读、幻读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡冻结是怎么回事 信用卡冻结后怎么解
- 下一篇: TFS中的工作项(六)