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