您好,登錄后才能下訂單哦!
今天剛好在看某個公眾號中提到了這個知識點,發現對這塊的解釋不是很到位,尤其是對幻讀這塊的解釋,很多文章都是相互復制粘貼,所以我們看到的大部分解釋都是類似的,很多人對幻讀這款不是很理解,讓看的人云里霧里、暈暈乎乎,所以拿出來說明一下;大家也可以留言,相互交流。
本文以mysqlsql為例,介紹如下內容:
1、什么是臟讀?
2、什么是讀已提交?
3、什么是可重復讀?
4、什么是幻讀?
臟讀、讀已提交、可重復讀、幻讀都是和事務隔離級別相關的一些東西,所以需要大家先理解事務相關的一些概念。
我們這里所說的事務大多數是指數據的事務,事務是指一個業務操作,一個業務操作內部包含多個小的子操作,這些操作要目全部一起執行成功,要么全部執行失敗,不存在說一部分成功一部分失敗的情況。
事務有以下特性(ACID):
1、原子性(Atomicity)
事務作為一個整體被執行,包含在其中的對數據庫的操作要么全部被執行,要么都不執行。
2、一致性(Consistency)
事務應確保數據庫的狀態從一個一致狀態轉變為另一個一致狀態。一致狀態的含義是數據庫中的數據應滿足完整性約束。
3、隔離性(Isolation)
多個事務并發執行時,一個事務的執行不應影響其他事務的執行。
4、持久性(Durability)
已被提交的事務對數據庫的修改應該永久保存在數據庫中
一個事務在執行的過程中讀取到了其他事務還沒有提交的數據。
這個還是比較好理解的。
從字面上我們就可以理解,即一個事務操作過程中可以讀取到其他事務已經提交的數據。
事務中的每次讀取操作,讀取到的都是數據庫中其他事務已提交的最新的數據(相當于當前讀)
一個事務操作中對于一個讀取操作不管多少次,讀取到的結果都是一樣的。
可重復讀中有種情況需要注意
如,事務A:
1、打開事務
2、select count(id) from t_a,返回10行
3、向A表插入一條記錄
4、select count(id) from t_a,返回11行
5、提交事務
有疑問?
上面不是說可重復讀不管讀取多少次,結果都是一樣的,這個地方為什么不一樣呢?
可重復讀是指對于其他事務操作的數據,多次讀取的結果都是一樣的,重點在于其他事務的數據,如果第一次讀取能夠讀取到其他事務的數據,后面不管其他事務有任何其他任何操作,都不會影響已讀取到的其他事務產生的數據。但是自己所在的事務中產生的數據,自己是都可以讀取到的。
臟讀、不可重復讀、可重復讀、幻讀,其中最難理解的是幻讀
以mysql為例:
幻讀在可重復讀的模式下才會出現,其他隔離級別中不會出現
幻讀現象例子:
可重復讀模式下,比如有個用戶表,手機號碼為主鍵,有兩個事物進行如下操作
事務A操作如下:
1、打開事務
2、查詢號碼為X的記錄,不存在
3、插入號碼為X的數據,插入報錯(為什么會報錯,先向下看)
4、查詢號碼為X的記錄,發現還是不存在(由于是可重復讀,所以讀取記錄X還是不存在的)
事物B操作:在事務A第2步操作時插入了一條X的記錄,所以會導致A中第3步插入報錯(違反了唯一約束)
上面操作對A來說就像發生了幻覺一樣,明明查詢X(A中第二步、第四步)不存在,但卻無法插入成功
幻讀可以這么理解:事務中后面的操作(插入號碼X)需要上面的讀取操作(查詢號碼X的記錄)提供支持,但讀取操作卻不能支持下面的操作時產生的錯誤,就像發生了幻覺一樣。
十年java老兵,只生產干貨,公眾號:路人甲Java,微信號:itsoku
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。